··
147
·
2024-08-17 16:03

Django将已经存在的字段改为外键

我有一个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个回答

你可以做数据迁移

  1. 添加新字段
  2. 执行数据迁移  https://docs.djangoproject.com/en/3.1/topics/migrations/#data-migrations
  3. 移除旧字段

我不是特别确定,可能还存在另一种解决办法,你可以先将字段重命名为你想要的名字,然后将该字段替换为新的类型(执行迁移)。

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
            ),
    ]


发布于 2024-08-17 16:22:42
举报