AlterField迁移适用于某些字段,而不适用于其他字段,但是所有字段都具有相同的更改

时间:2020-04-23 16:45:27

标签: django-migrations

我进行了一次迁移,将varchar字段更改为外键字段。在数据库中,这些varchar字段没有任何值-所有值均为null,因此这不是此问题的一个因素。 AlterField操作中的两个没有任何问题,但是其他两个失败。当我们尝试运行迁移时,我们收到一个ValueError,表明相关模型无法解析。

这是models.py中的内容-该代码实际上在另一个系统上,我正在重新输入代码。由于安全问题,我也不能输入真实姓名,所以我混淆了姓名:

class A(DisplayValuePair):
    pass

class B(DisplayValuePair):
    pass

class C(DisplayValuePair):
    pass

class D(DisplayValuePair):
    pass

class PropertiesFile(models.Model):
    # there lots of other foreign key fields that already exist in the model
    # that are defined the same way, but these are new. The fields used to all
    # be models.CharField
    my_a_field = models.ForeignKey(A, null=True, blank=True, on_delete=_PROTECT)
    my_b_field = models.ForeignKey(B, null=True, blank=True, on_delete=_PROTECT)
    my_c_field = models.ForeignKey(C, null=True, blank=True, on_delete=_PROTECT)
    my_d_field = models.ForeignKey(D, null=True, blank=True, on_delete=_PROTECT)

执行makemigrations时,创建的迁移为

migrations.AlterField(
    model_name="propertiesfile",
    name="my_a_field",
    field=models.ForeignKey(blank=true, null=True, 
                            on_delete=django.db.models.delete.PROTECT,
                            to='data_exporter_app.A'),
),
migrations.AlterField(
    model_name="propertiesfile",
    name="my_b_field",
    field=models.ForeignKey(blank=true, null=True, 
                            on_delete=django.db.models.delete.PROTECT,
                            to='data_exporter_app.B'),
),
migrations.AlterField(
    model_name="propertiesfile",
    name="my_c_field",
    field=models.ForeignKey(blank=true, null=True, 
                            on_delete=django.db.models.delete.PROTECT,
                            to='data_exporter_app.C'),
),
migrations.AlterField(
    model_name="propertiesfile",
    name="my_d_field",
    field=models.ForeignKey(blank=true, null=True, 
                            on_delete=django.db.models.delete.PROTECT,
                            to='data_exporter_app.D'),
),

当我在一台特定的服务器上运行迁移时,更改my_c_field失败。前两个my_a_field和my_b_field可以毫无问题地转换为表中的外键字段。但是my_c_field和my_d_field失败。除了名称以外,它们在models.py文件中的定义方式相同。

我找到了一个解决方法,但是我很困惑为什么必须这样处理。我不理会A类和B类,并在PropertiesFile类中移动了C和D的定义。

class PropertiesFile(models.Model):

    class C(DisplayValuePair):
        pass

    class D(DisplayValuePair):
        pass

    # there lots of other foreign key fields that already exist in the model
    # that are defined the same way, but these are new. The fields used to all
    # be models.CharField
    my_a_field = models.ForeignKey(A, null=True, blank=True, on_delete=_PROTECT)
    my_b_field = models.ForeignKey(B, null=True, blank=True, on_delete=_PROTECT)
    my_c_field = models.ForeignKey(C, null=True, blank=True, on_delete=_PROTECT)
    my_d_field = models.ForeignKey(D, null=True, blank=True, on_delete=_PROTECT)

如果C.class和D类的定义在models.py文件中,那么除非我将它们移到PropertiesFile中,否则它将如何解决在PropertiesFile中使用这些类的问题?

1 个答案:

答案 0 :(得分:0)

在其他服务器上尝试此操作后,问题被隔离到终端会话超时。超时使迁移处于某种挂起状态,因此尝试仅执行剩余的AlterField操作失败。我认为这是典型的真实错误案例,但其他迁移过程只能弄清楚它无法解析类,因此引发了该错误。