在Django中,我想在类级别上实现__getitem__
(所以在下面的例子中,我想做Alpha['a']
)。我发现我需要一个元类:就像它需要在类上实现它才能在实例上访问它,它必须在元类上实现才能在类级别上使用它,正如我所理解的那样。
class AlphaMeta(type):
a = 7
def __getitem__(self, key):
return getattr(self, key)
class Alpha(models.Model):
value = models.CharField(max_length = 64, default = '')
__metaclass__ = AlphaMeta
print Alpha['a']
问题是我收到以下错误。如果Alpha是一个普通的新式类(class Alpha(object)
),它可以正常工作,但对于更复杂的基础,它需要更多。但是,我并不能解决它对我的要求,因为我不明白the metaclasses of all it's bases
是什么。
metaclass conflict: the metaclass of a derived class must be a
(non-strict) subclass of the metaclasses of all it's bases
我对元类很新;任何提示都非常感谢!
编辑:模型字段位于Alpha
而不是AlphaMeta
答案 0 :(得分:1)
我真的建议避免搞乱模型的元类,因为你很容易遇到一些难以调试的奇怪问题。无论如何,如果您仍想这样做,错误消息会告诉您需要做什么。
AlphaMeta
必须是models.Model
元类的子类,即django.db.models.base.ModelBase
。所以试试
from django.db.models.base import ModelBase
class AlphaMeta(ModelBase):
…
您可能还想在KeyError
。