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)
您可以使用%(class)s或%(app_label)s
class HasSystemMessage(models.Model):\n class Meta:\n abstract = True\n\n messages = models.ManyToManyField(SystemMessage, related_name=%(app_label)s_%(class)s_related)\nRun Code Online (Sandbox Code Playgroud)\n\n来自 Django 文档
\n\n\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
参考:https: //docs.djangoproject.com/en/2.0/topics/db/models/#be-careful-with-lated-name-and-lated-query-name
\n