django 在 SQL 服务器中指定列排列
django specify column arrangement in SQL Server
我正在使用 Django ORM 创建我的数据库 tables 并执行其余操作。但是,我注意到如果我在数据库中看到的列与我在 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)
但是在数据库中,当我看到 table 时,外键是最后一列,所以它看起来像
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 在构建模型后推迟创建 ForeignKey
s、ManyToManyField
s、OneToOneField
s 等。事实上,这有时是必要的,例如,如果您要构建模型 M1 和 M2,他们都有一个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<strong>.AddField(</strong>
model_name='itemmetadata',
name='field'
field=models.CharField(max_length=80)
),
migrations.<strong>.AddField(</strong>
model_name='itemmetadata',
name='field_value',
field=models.CharField(max_length=80)
),
migrations.<strong>.AddField(</strong>
model_name='itemmetadata',
name='created_at',
field = models.DateTimeField(auto_now_add=True)
),
migrations.<strong>.AddField(</strong>
model_name='itemmetadata',
name='modified_at',
field=models.DateTimeField(auto_now=True)
)
如果您随后从一个没有任何表的空数据库开始,它通常会将 item_id
作为第二个字段。
话虽这么说,通常字段的顺序并不重要(那么重要)。特别是如果您使用 Django ORM 进行查询,那么 Django 将确保以正确的顺序获取列以将这些列映射到模型对象。
我正在使用 Django ORM 创建我的数据库 tables 并执行其余操作。但是,我注意到如果我在数据库中看到的列与我在 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)
但是在数据库中,当我看到 table 时,外键是最后一列,所以它看起来像
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 在构建模型后推迟创建 ForeignKey
s、ManyToManyField
s、OneToOneField
s 等。事实上,这有时是必要的,例如,如果您要构建模型 M1 和 M2,他们都有一个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<strong>.AddField(</strong>
model_name='itemmetadata',
name='field'
field=models.CharField(max_length=80)
),
migrations.<strong>.AddField(</strong>
model_name='itemmetadata',
name='field_value',
field=models.CharField(max_length=80)
),
migrations.<strong>.AddField(</strong>
model_name='itemmetadata',
name='created_at',
field = models.DateTimeField(auto_now_add=True)
),
migrations.<strong>.AddField(</strong>
model_name='itemmetadata',
name='modified_at',
field=models.DateTimeField(auto_now=True)
)
如果您随后从一个没有任何表的空数据库开始,它通常会将 item_id
作为第二个字段。
话虽这么说,通常字段的顺序并不重要(那么重要)。特别是如果您使用 Django ORM 进行查询,那么 Django 将确保以正确的顺序获取列以将这些列映射到模型对象。