0

在 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

4

1 回答 1

1

我真的建议避免弄乱模型的元类,因为您很容易遇到一些难以调试的奇怪问题。无论如何,如果您仍想这样做,错误消息会告诉您需要做什么。

AlphaMeta需要是 的元类的子类models.Model,即django.db.models.base.ModelBase. 所以试试

from django.db.models.base import ModelBase

class AlphaMeta(ModelBase):
    …

您可能还想在 a 的情况下调用超类实现KeyError

于 2012-12-28T01:44:09.900 回答