当我try 在Django应用程序中执行makemigrations时,我遇到了与循环引用相关的错误.我定义了一个从Models.Model继承的抽象类A,以及两个子类BC.然而,我似乎在这些班级之间的关系上犯了错误.相关代码如下:

class A(models.Model):
    class Meta:
        abstract = True
    id = models.AutoField(primary_key=True)
    
    z = models.ForeignKey(Z, on_delete=models.CASCADE, related_name="relateds")


class B(A):
    algo = models.CharField(max_length=32, default="")


class C(A):
    foo = IntegerField()

我面临以下错误:

Z.B.z:(fields.E305)‘z.B.z’的反向查询名称与‘z.C.z’的反向查询名称冲突.

如有任何帮助或建议来解决这个问题,我们将不胜感激!

推荐答案

这不起作用的原因是因为您有两个真实的模型BC,每个模型的值都是ForeignKeyZ,因此Z不能同时具有值为related_name=… [Django-doc]same.为什么?因为相关名称是reverse中关系的名称.所以从ZBC.所以,如果你要查询my_z.relateds.all(),那么它应该瞄准什么型号?B还是C

您可以通过让related_name=…依赖于在其中定义它的类的名称来解决它,例如:

class A(models.Model):
    z = models.ForeignKey(Z, on_delete=models.CASCADE, related_name='%(class)ss')

    class Meta:
        abstract = True

或通过以下方式:

class A(models.Model):
    z = models.ForeignKey(Z, on_delete=models.CASCADE, related_name='%(class)s_set')

    class Meta:
        abstract = True

但如果你不自己指定一个相关的名字,Django就会这么做,这可能是最好的 Select :

class A(models.Model):
    z = models.ForeignKey(Z, on_delete=models.CASCADE)  # 🖘 no related_name=…

    class Meta:
        abstract = True

Python相关问答推荐

配置Sweetviz以分析对象类型列,而无需转换

如何使用Google Gemini API为单个提示生成多个响应?

使用miniconda创建环境的问题

查找两极rame中组之间的所有差异

两个pandas的平均值按元素的结果串接元素.为什么?

如何在python polars中停止otherate(),当使用when()表达式时?

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

海上重叠直方图

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

python中的解释会在后台调用函数吗?

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

OpenCV轮廓.很难找到给定图像的所需轮廓

如何强制向量中的特定元素在Gekko中处于优化解决方案中

freq = inject在pandas中做了什么?''它与freq = D有什么不同?''

删除特定列后的所有列

当输入是字典时,`pandas. concat`如何工作?

来自Airflow Connection的额外参数

将相应的值从第2列合并到第1列(Pandas )

时间戳上的SOAP头签名无效

如何在不遇到IndexError的情况下将基数10的整数转换为基数80?