如何在Django模型Mixin的字段定义中引用模型名称?
问题描述
在Django的模型Mixin字段定义中,如何引用子类的模型名称?例如在以下CreatedByMixin代码中,需要替换哪部分内容来替代model_name,使得继承该Mixin的MyModel模型对应的created_by字段的related_name为MyModel_created?
Mixin代码示例:
class CreatedByMixin(models.Model): class Meta: abstract = True created_by = ForeignKey( User, verbose_name="Created by", help_text="User that created the record", related_name=f"{model_name}_created", editable=False, )
继承Mixin的模型示例:
class MyModel(UserAuditMixin, TimeStampedModel): class Meta: db_table_comment = "Participants are the users that are involved in the transcript" field1 = models.TextField()
解决方案
Django为抽象模型提供了**%(class)s占位符**,可以在定义Mixin时动态获取子类的模型类名,自动替换到related_name中。
修改后的CreatedByMixin代码如下:
from django.db import models from django.contrib.auth.models import User class CreatedByMixin(models.Model): class Meta: abstract = True created_by = models.ForeignKey( User, verbose_name="创建人", help_text="创建该记录的用户", related_name="%(class)s_created", editable=False, on_delete=models.CASCADE, # Django 3.2+必须指定on_delete参数 )
说明
%(class)s的作用:当子类(比如MyModel)继承该Mixin时,Django会自动将%(class)s替换为子类的类名(即MyModel),最终related_name会被设置为MyModel_created,完全符合需求。- 补充
on_delete参数:Django 3.2及以上版本要求ForeignKey必须指定on_delete参数,否则会抛出异常,可根据业务需求选择CASCADE、PROTECT等合适的行为。
当MyModel继承该Mixin后,你可以通过user.MyModel_created.all()来查询该用户创建的所有MyModel实例。
内容的提问来源于stack exchange,提问作者Greg St. Onge
相关产品推荐
相关产品推荐

