Django:在抽象基类上使用与“%(class)s”不同的 related_name 来解释不规则的复数

C4X*_*C4X 6 django inheritance querying plural

我有以下型号:

from django.db import models
from foo.bar.models import Location


class AbstractShop(models.Model):
    location = models.ForeignKey(Location, on_delete=models.CASCADE, related_name="%(class)s")

    class Meta(self):
        abstract = True


class Bakery(AbstractShop):
    some_field = models.BooleanField("Some field", default=True)

    class Meta:
        verbose_name = "Bakery"
        verbose_name_plural = "Bakeries"


class Supermarket(AbstractShop):
    some_other_field = models.CharField("Some other field", max_length=20)

    class Meta:
        verbose_name = "Supermarket"
        verbose_name_plural = "Supermarkets"
Run Code Online (Sandbox Code Playgroud)

现在,Supermarket以及Bakery继承location-ForeignKey 从AbstractShop.
如果我想查询Bakery模型上的反向关系Location,我必须使用bakerys(而不是正确的bakeries) as related_name- 我不想要它,因为它在语法上是错误的且不直观。

所以我的问题是:

  1. 有什么办法可以使用verbose_name_pluralasrelated_name吗?

  2. related_name除了"%(class)s"或者"%(app_label)s我只需要在子类上实现ForeignKey之外,还有什么方法可以使用吗?

如果是这样的话,那就有点烦人了。想象一下你有很多共享的外键:你可以将英语中具有规则复数的外键移至抽象基类(ABC)(因为对于规则名词,添加“s”会产生"%(class)s"正确的复数形式),而那些具有不规则复数形式的外键必须在子类上实现(因为只有在那里可以related_name设置为子类实际名称的复数,而你在 ABC 中不知道)。
这是一个完全任意的条件,对于非英语母语人士来说可能并不明显,而且它将语言逻辑转换为代码,恕我直言,这是不应该发生的。