Django自定义抽象模型Meta.abstract莫名变为False的问题求助
问题原因与解决方法
原因
你遇到的问题核心在于错误直接访问模型类的Meta.abstract属性,而非Django官方认可的_meta.abstract。
Django的ModelBase元类处理抽象模型时,会做一个特殊操作:将原定义的Meta.abstract设为False,目的是避免子类自动继承abstract=True(这和你最初理解的“子类不会继承抽象属性”逻辑一致)。但模型真正的抽象状态,是存储在模型类的_meta.abstract属性里的——这个属性才是Django内部判断模型是否为抽象类的依据。你代码里打印的Class.Meta.abstract: False是Django修改后的结果,并非模型实际的抽象状态。
解决方法
把元类中的判断条件从if not Class.Meta.abstract改成if not Class._meta.abstract即可。修改后的代码如下:
from django.db import models from django.db.models.base import ModelBase class MyMeta(ModelBase): def __new__(cls, name, bases, attrs, **kwargs): """Check that all implemented (not abstract) classes have a foo attribute""" Class = super().__new__(cls, name, bases, attrs, **kwargs) # 改用 _meta.abstract 判断是否为抽象类 if not Class._meta.abstract: print(Class) print('Class._meta.ordering:', Class._meta.ordering) print('Class._meta.abstract:', Class._meta.abstract) if not hasattr(Class, 'foo'): raise NotImplementedError('Please add a foo attribute') return Class class MyAbstractModel(models.Model, metaclass=MyMeta): name = models.CharField(max_length=250) class Meta: abstract = True ordering = ('-name',)
修改后,MyAbstractModel的_meta.abstract为True,不会进入检查逻辑,也就不会触发NotImplementedError;当你创建继承自它的非抽象子类时,子类的_meta.abstract为False,会正常执行属性检查。
内容的提问来源于stack exchange,提问作者run_the_race
相关产品推荐
相关产品推荐

