2

假设我有这个与南方相关的模型:

class MyModel(models.Model):
    field_a = models.CharField(max_length=30)
    field_b = models.CharField(max_length=30)

现在稍后我想再添加一个字段,所以我在两者之间创建了该字段field_afield_b现在我的模型看起来像:

class MyModel(models.Model):
    field_a = models.CharField(max_length=30)
    field_c = models.CharField(max_length=30)
    field_b = models.CharField(max_length=30)

然后我迁移了更改,在检查 MySQL 中的表结构时,它field_c是在所有字段的末尾创建的。我如何告诉南保持字段顺序,例如在field_a.

在 MySQL 中,我们可以在任何现有字段之前或之后插入新字段。在南方能做到吗?

4

3 回答 3

7

我不相信在使用 Django(或 South)时不能强制 MySQL 中的字段创建顺序。新字段将始终附加到表定义的末尾。

但是:列的顺序应该与您无关。继续阅读...

如果您正在针对您的数据库编写 SQL 查询,那么select *依赖表的字段顺序是一种不好的做法。相反,您应该指定要选择的字段,以及您希望它们报告的顺序。这使得基础表的字段顺序变得不重要。

此外,如果您的组织中的任何人当前正在编写使用select *: 的报告,通过在其他人之间插入新列,您可以轻松破坏使用字段位置(而不是字段名称)的报告,因为列的索引会发生变化。

于 2013-01-07T12:42:17.987 回答
1

正如史蒂夫梅恩所说,如果你不断更新你的模型,没有直接的方法可以做到这一点。有一个黑客可以做到这一点。

正如您已经观察到的,第一次创建模型时,所有定义一个接一个。

如果您想在添加新列后绝对确定模型的顺序,请登录 MySQL shell。这通常使用mysql -u<user> -p. 告诉它使用你的数据库USE db

然后,使用 手动插入新列ALTER TABLE table ADD field_c VARCHAR(30) AFTER field_a

现在你可以通过编辑你的MyModel类来告诉 Django。

class MyModel(models.Model):
    field_a = models.CharField(max_length=30)
    field_c = models.CharField(max_length=30)
    field_b = models.CharField(max_length=30)

显然,如果您的模型发生很大变化,这真的很烦人。希望这不会发生。

于 2013-01-07T12:52:00.457 回答
0

这是一个对我有用的解决方法:

1)像你一样在你的model.py文件中创建你的模型,但只添加第一个字段。

2)进行迁移,但还没有迁移。

3)逐个添加每个字段,并在每个字段之后进行迁移。

4)在拥有它们之后,迁移。

这对我有用。如果您已经设计了模型,那么您可以:

0)删除您的模型,进行迁移,迁移,然后撤消删除(您将丢失数据,如果需要,将其转储)。

1)从底部一个一个地剪切/删除每个字段,但第一个。

2)进行迁移

3)撤消以使第二个字段返回并进行迁移。对其他人重复。

4)最后,迁移。

于 2015-06-02T22:03:23.220 回答