django指定SQL Server的列排列



我使用Django ORM来创建我的数据库表并执行其余的操作。然而,我注意到,如果我在数据库中看到的列不是我在django模型中指定的顺序。

例如,我的模型是

class ItemMetaData(models.Model):
item = models.ForeignKey(Item, on_delete=CASCADE)
field = models.CharField(max_length=80)
field_value = models.CharField(max_length=80)
created_at = models.DateTimeField(auto_now_add=True)
modified_at = models.DateTimeField(auto_now=True)

但是在数据库中,表的外键是最后一列所以它看起来像

id | field | field_value | created_at | modified_at | item_id

我希望我的item_id是id之后的第一列。这样的:

id | item_id | field | field_value | created_at | modified_at

这可能吗?我试图搜索,但当我寻找排序所有的答案假设它的行排序,并建议使用order_by

迁移文件如下所示:

migrations.CreateModel(
name='ItemMetaData',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('field', models.CharField(max_length=80)),                    
('field_value', models.CharField(max_length=80)),
('created_at', models.DateTimeField(auto_now_add=True)),
('modified_at', models.DateTimeField(auto_now=True)),
],
options={
'db_table': 'app_item_meta_data',
},
),
migrations.AddField(
model_name='itemmetadata',
name='item',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.item'),
),

发生这种情况的原因是因为Django在模型构建之后推迟了创建ForeignKeys,ManyToManyFields,OneToOneFields等。事实上,这有时是必要的,例如,如果您要构建模型M1M2,并且它们都有一个ForeignKey来相互引用。在这种情况下,不能在同一个CreateModel迁移中创建第一个模型和ForeignKey,因为那时M2还不存在。

如果您想更改字段的顺序,您可以在添加ForeignKey之后添加项,例如:

migrations.CreateModel(
name='ItemMetaData',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
],
options={
'db_table': 'app_item_meta_data',
},
),
migrations.AddField(
model_name='itemmetadata',
name='item',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.item'
),
),
migrations.AddField(
model_name='itemmetadata',
name='field'
field=models.CharField(max_length=80)
),
migrations..AddField(
model_name='itemmetadata',
name='field_value',
field=models.CharField(max_length=80)
),
migrations..AddField(
model_name='itemmetadata',
name='created_at',
field = models.DateTimeField(auto_now_add=True)
),
migrations..AddField(
model_name='itemmetadata',
name='modified_at',
field=models.DateTimeField(auto_now=True)
)

如果你从一个没有任何表的空数据库开始,它通常会把item_id作为第二个字段。

也就是说,通常字段的顺序并不重要(那么多)。特别是如果你使用Django ORM进行查询,那么Django将确保以正确的顺序获取列,并将这些列映射到模型对象。

相关内容

  • 没有找到相关文章

最新更新