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):
    …

の場合は、おそらくスーパークラスの実装も呼び出したいと思うでしょうKeyError

于 2012-12-28T01:44:09.900 に答える