我有一个Django模型,它之前是这样的
class Car(models.Model):
manufacturer_id = models.IntegerField()
然后还有另一个名为Manufacturer
的模型,id
字段所指的就是它。然而,后来我意识到使用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
因为我需要可靠地在开发、生产和同事的电脑上工作。
内容来源于 Stack Overflow, 遵循 CCBY-SA 4.0 许可协议进行翻译与使用。原文链接:Django change an existing field to foreign key
1个回答
你可以做数据迁移
- 添加新字段
- 执行数据迁移 https://docs.djangoproject.com/en/3.1/topics/migrations/#data-migrations
- 移除旧字段
我不是特别确定,可能还存在另一种解决办法,你可以先将字段重命名为你想要的名字,然后将该字段替换为新的类型(执行迁移)。
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
),
]