2012-12-28 84 views
0

在Django中,我想在類級別上實現__getitem__(所以在下面的示例中,我想做Alpha['a'])。我發現我需要一個元類:就像它需要在一個類上實現以使它在實例上可訪問一樣,它必須在元類上實現以在類級別上使用它,據我所知。Django __getitem__模型:元類衝突

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

回答

1

去,我真的建議避免使用的模型元類搞亂,你可以很容易碰到那些難以調試一些奇怪的問題。無論如何,如果你仍然想這樣做,錯誤消息告訴你你需要做什麼。

AlphaMeta需要是models.Model的元類的子類,它是django.db.models.base.ModelBase。所以請嘗試

from django.db.models.base import ModelBase 

class AlphaMeta(ModelBase): 
    … 

您可能還想調用超類實現的情況下KeyError

+0

感謝您的回答!那麼,我可能不會走那條路,謝謝你的警告。無論如何,它的工作。我擔心它可能會爲元班提供一張桌子,但它並非如此美妙。 – Mark

+0

爲什麼不把'a = 7'加到'Alpha'然後用'Alpha.a'? –

+0

這是一個簡化的例子:)例如,我比較方便地爲'Model的item.value'稍微方便些。但確實沒有什麼東西是傳統方式完全不可能的。 – Mark