如何在抽象模型中的 ManyToMany 字段中设置 related_name ?

raz*_*aee 3 python django inheritance django-models

我有这个抽象模型:

class HasSystemMessage(models.Model):
    class Meta:
        abstract = True

    messages = models.ManyToManyField(SystemMessage, related_name=?)
Run Code Online (Sandbox Code Playgroud)

我将在至少三个其他模型中使用这个抽象模型,比如说 A、B 和 C。如何为这些类动态设置 related_name?例如,对于 B 类,我希望 related_name 为 Bs。可以这样做吗?

为了进一步澄清这个问题,这些类将如下所示:

class B(HasSystemMessage):
    # Some model fields 
class A(HasSystemMessage):
    # Some model fields

HasSystemMessage.objects.filter(a__contains=[some elements])
Run Code Online (Sandbox Code Playgroud)

war*_*esh 5

您可以使用%(class)s%(app_label)s

\n\n
class HasSystemMessage(models.Model):\n    class Meta:\n        abstract = True\n\n    messages = models.ManyToManyField(SystemMessage, related_name=%(app_label)s_%(class)s_related)\n
Run Code Online (Sandbox Code Playgroud)\n\n

来自 Django 文档

\n\n
\n

请小心相关名称和相关查询名称\xc2\xb6 如果您在ForeignKey 或ManyToManyField 上使用相关名称或相关查询名称,\n 您必须始终为该字段指定唯一的反向名称和查询名称。这通常会在抽象基类中引起问题,因为此类上的字段包含在每个子类中,并且每次的属性值都完全相同(包括 related_name 和 related_query_name)。

\n\n

要解决此问题,当您(仅)在抽象基类中使用 related_name 或 related_query_name 时,部分值应包含 \'%(app_label)s\' 和 \'%(class)s\ '。

\n\n

\'%(class)s\' 替换为使用该字段的子类\n 的小写名称。\'%(app_label)s\' 替换为\n 的小写名称子类所在的应用程序。每个已安装的应用程序名称必须是唯一的,并且每个应用程序内的模型类名称也必须是唯一的,因此生成的名称最终会有所不同。

\n
\n\n

参考:https: //docs.djangoproject.com/en/2.0/topics/db/models/#be-careful-with-lated-name-and-lated-query-name

\n