如何在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
相关产品推荐
相关产品推荐

