我进行了一次迁移,将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中使用这些类的问题?
答案 0 :(得分:0)
在其他服务器上尝试此操作后,问题被隔离到终端会话超时。超时使迁移处于某种挂起状态,因此尝试仅执行剩余的AlterField操作失败。我认为这是典型的真实错误案例,但其他迁移过程只能弄清楚它无法解析类,因此引发了该错误。