You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django模型Mixin的字段定义中引用模型名称?

在Django模型Mixin中动态引用模型名称设置related_name

问题描述

在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参数
    )

说明

  1. %(class)s的作用:当子类(比如MyModel)继承该Mixin时,Django会自动将%(class)s替换为子类的类名(即MyModel),最终related_name会被设置为MyModel_created,完全符合需求。
  2. 补充on_delete参数:Django 3.2及以上版本要求ForeignKey必须指定on_delete参数,否则会抛出异常,可根据业务需求选择CASCADE、PROTECT等合适的行为。

当MyModel继承该Mixin后,你可以通过user.MyModel_created.all()来查询该用户创建的所有MyModel实例。

内容的提问来源于stack exchange,提问作者Greg St. Onge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:05:08