【发布时间】: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 中这些类的使用?
【问题讨论】: