【问题标题】:Django change an existing field to foreign keyDjango将现有字段更改为外键
【发布时间】:2023-03-10 12:51:01
【问题描述】:

我曾经有一个这样的模型:

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,因为我需要可靠地跨开发、生产和我同事的计算机工作。

【问题讨论】:

    标签: python python-3.x django django-migrations


    【解决方案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
                ),
        ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-10
      • 2011-11-16
      • 2014-01-17
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      相关资源
      最近更新 更多