django 在 SQL Server 中指定列排列

Posted

技术标签:

【中文标题】django 在 SQL Server 中指定列排列【英文标题】:django specify column arrangement in SQL Server 【发布时间】:2021-10-31 16:54:27 【问题描述】:

我正在使用 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'),
        ),

【问题讨论】:

我不明白为什么订单是相关的。可以分享一下迁移文件吗?可能有人可以更改迁移文件,然后迁移一个空数据库以尊重字段顺序。 当我查看数据库时,这更像是一种强迫症,这似乎很荒谬。显然,当我查询时,我可以指定我想要的字段的顺序,所以这不是什么大问题。让我编辑问题以添加迁移文件 【参考方案1】:

之所以会出现这种情况,是因为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 将确保以正确的顺序获取列以将它们映射到模型对象。

【讨论】:

哦,好吧,我明白你的意思。非常感谢!所以这意味着我必须手动更改迁移文件,这似乎是我们不应该做的事情,所以我会顺其自然。不过还是谢谢!

以上是关于django 在 SQL Server 中指定列排列的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server查询优化与事务处理

匹配或返回与 R 中指定列具有相同日期的列

如何输出分组对象中指定列中所有值的列表

ON 子句和 INCLUDE 子句中指定列的索引声明差异

jquery 如何能去掉表中指定列重复的数据

SqlSever基础 查看一个数据库中的一个表中指定列的内容