首页 > 解决方案 > 如何更改 django 基类的related_name?

问题描述

我被困在这种情况下:

我有两个不同的关系指向同一个模型,所以我必须给 m2m 字段一个related_name。

class A(models.Model):
    b = models.ForeignKey(B, on_delete=models.SET_NULL, null=True,)
    b_m2m = models.ManyToManyField(B, verbose_name='additional_a',
                                              blank=True, related_name="additional_a_group")

它运作良好,直到我想继承它

class ABase(models.Model):
    b = models.ForeignKey(B, on_delete=models.SET_NULL, null=True,)
    b_m2m = models.ManyToManyField(B, verbose_name='additional_a',
                                              blank=True, related_name="additional_a_group")
    class Meta:
        abstract = True

class A(ABase):
    pass

class C(ABase):
    pass

现在的问题是,B 与 A 和 C 的反向关系具有相同的 related_name additional_a_group,我不知道如何解决它。

如果我删除 ABase 中的 related_name,b 和 b_m2m 会发生冲突。但是,如果我把它留在这里,A 和 C 就会发生冲突。

我回顾了源代码,related_nameManyToManyRel.get_accessor_name. 也许我可以通过同时覆盖ManyToManyFieldand来解决它ManyToManyRel,但是有什么更简单的吗?

标签: djangodjango-models

解决方案


它需要生成两个不同的related_names。

b_m2m = models.ManyToManyField(
    B, 
    verbose_name='additional_a',
    blank=True, 
    related_name="%(class)s_additional_a_group"
)

推荐阅读