【问题标题】:AlterField migration works for some fields, not others, but all have the same changeAlterField 迁移适用于某些字段,而不适用于其他字段,但都具有相同的更改
【发布时间】:2020-08-07 02:14:54
【问题描述】:

我有一个将 varchar 字段更改为外键字段的迁移。在数据库中,这些 varchar 字段没有任何值——所有值都是空的,所以这不是这个问题的一个因素。两个 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 和类 D 的定义在 models.py 文件中,那么除非我将它们移到 PropertiesFile 中,否则如何无法解决 PropertiesFile 中这些类的使用?

【问题讨论】:

    标签: django-migrations


    【解决方案1】:

    在不同的服务器上尝试此操作后,问题被隔离为终端会话超时。超时使迁移处于某种挂起状态,因此尝试仅执行剩余的 AlterField 操作失败。我认为这是一个真正的错误是其他东西的经典案例,但所有迁移可以弄清楚的是它无法解析一个类,所以它抛出了那个错误。

    【讨论】:

      猜你喜欢
      • 2016-08-16
      • 2017-03-25
      • 2017-05-14
      • 1970-01-01
      • 2011-12-08
      • 2014-10-12
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多