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

如何在django-polymorphic中禁止实例化基类模型?

实现方法

有两种常用的拦截方案可以实现需求,注意不要将基类Product设置为abstract = True,会导致django-polymorphic依赖的基类表无法生成,多态逻辑失效。

方案1:实例化阶段直接拦截(推荐)

重写基类的__new__方法,在实例创建前判断调用类是否为基类本身,是则直接抛出异常:

from django.core.exceptions import ValidationError
from polymorphic.models import PolymorphicModel

class Product(PolymorphicModel):
    # 原有字段定义

    def __new__(cls, *args, **kwargs):
        # 检测是否直接实例化基类
        if cls is Product:
            raise ValidationError("无法直接创建Product基类实例,请使用ProductType1或ProductType2子类创建")
        return super().__new__(cls, *args, **kwargs)

该方案覆盖所有实例化场景,子类实例化时cls为子类类型,不会触发拦截逻辑,符合预期。

方案2:数据保存阶段拦截

如果需要兼容表单、admin的校验场景,可以额外重写基类的clean方法:

class Product(PolymorphicModel):
    # 原有字段定义

    def clean(self):
        if self.__class__ is Product:
            raise ValidationError("不允许直接保存基类Product实例")
        super().clean()

额外优化(后台适配)

如果使用django admin,只需注册子类ProductType1、ProductType2到后台,不注册基类Product,即可避免运营人员在后台误操作创建基类实例。

内容的提问来源于stack exchange,提问作者Mohammad Reza Bozorgmehr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:27:02