Django将现有字段更改为外键

ukqbszuj  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(186)

我有一个Django模型,它看起来像这样:

class Car(models.Model):
    manufacturer_id = models.IntegerField()

id字段引用了另一个名为Manufacturer的模型。然而,我意识到使用Django内置的外键功能会很有用,所以我将模型改为:

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer)

这个更改似乎立即工作正常,查询工作没有错误,但当我尝试运行迁移时,Django输出如下:

- Remove field manufacturer_id from car
- Add field manufacturer to car

执行此迁移将清除数据库中的所有现有关系,所以我不想这样做。我真的不想进行任何迁移,因为像Car.objects.get(manufacturer__name="Toyota")这样的查询可以正常工作。我想要一个适当的数据库外键约束,但它不是一个高优先级。
所以我的问题是是否有一种方法可以进行迁移或其他操作,使我能够将现有字段转换为外键?我不能使用--fake,因为我需要跨dev、prod和同事的计算机可靠地工作。

tzcvj98z

tzcvj98z1#

您可以进行数据迁移
1.添加新字段
1.执行数据迁移https://docs.djangoproject.com/en/3.1/topics/migrations/#data-migrations
1.删除旧字段
我不确定,可能有另一种解决方案,您可以重命名该字段的名称,你想,然后改变了提交到新的类型(做迁移)

operations = [
        migrations.RenameField(
            model_name='car',
            old_name='manufacturer_id',
            new_name='manufacturer',
        ),
        migrations.AlterField(
            model_name='car',
            name='manufacturer',
            field=ForeignKey(blank=True, null=True,  
                  on_delete=django.db.models.deletion.CASCADE
            ),
    ]
4dbbbstv

4dbbbstv2#

我今天也遇到了同样的问题。可以在不重命名现有字段或删除现有列的情况下完成。
1.使用CreateModel操作更新初始迁移

...
        migrations.CreateModel(
            name="Car",
            fields=[
                (
                    "manufacturer",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.DO_NOTHING,
                        db_constraint=False,
                        db_index=False,
                        to="Manufacturer",
                    ),
                ),

1.检查db_constraintdb_index是否为Car.manufacturer字段中True。如果未设置字段,则为默认值True。
1.运行./manage.py makemigrations,生成AlterField迁移,并在Car.manufacturer_id上使用所需的约束和索引。
第一步不会影响数据库一致性,因为IntegerFieldForeignKey生成的DDL与db_constaint=Falsedb_index=False相同,第二步迁移添加了缺失的约束和索引。
您可以使用./manage.py sqlmigrate app migration命令进行检查

相关问题