假设我有这个与南方相关的模型:
class MyModel(models.Model):
field_a = models.CharField(max_length=30)
field_b = models.CharField(max_length=30)
现在稍后,我想添加一个字段,以便在field_a
和field_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中,我们可以在任何现有字段之前或之后插入新字段。是不是可以在南方做到这一点?
答案 0 :(得分:7)
我不相信在使用Django(或南方)时不可能强制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)最后,迁移。