使用南方时如何维护模型字段的顺序结构

时间:2013-01-07 12:36:38

标签: python django django-south

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

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中,我们可以在任何现有字段之前或之后插入新字段。是不是可以在南方做到这一点?

3 个答案:

答案 0 :(得分:7)

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

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

如果您正在针对数据库编写SQL查询,那么执行select *并依赖表的字段顺序是不好的形式。您应该指定要选择的字段以及报告它们的顺序。这使得基础表的字段排序不重要。

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

答案 1 :(得分: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)

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

答案 2 :(得分:0)

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

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

2)进行迁移,但尚未迁移。

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

4)完成所有操作后,迁移。

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

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

1)逐个剪切/删除每个字段,但是第一个字段。

2)进行迁移

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

4)最后,迁移。