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'),
),
The reason that this happens is because Django postpones creating ForeignKey
s, ManyToManyField
s, OneToOneField
s, etc. after the models are constructed. Indeed, this is sometimes necessary, for example if you would construct models M1 and M2, and they both have a ForeignKey
to refer to each other. In that case one can not create the first model and create the ForeignKey
in the same CreateModel
migration, since at that time M2 does not yet exists.
Если вы хотите изменить порядок полей, вы можете работать с миграцией, где вы добавляете элементы после добавления 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 обеспечит получение столбцов в правильном порядке, чтобы сопоставить их с объектами модели.