2013-03-12 41 views
5

這是我在一個廣義的自然關鍵模型管理器中的嘗試。它就像the docs,除了它嘗試(不成功)從Meta.unique_together屬性中確定自然鍵字段名稱。模型管理器可以訪問模型的元屬性(`Meta.unique_together`)嗎?

class NaturalKeyModelManager(Manager): 

    def get_by_natural_key(self, *args): 
     field_dict = {} 
     for i, k in enumerate(self.model.Meta.unique_together[0]): 
      field_dict[k] = args[i] 
     return self.get(**field_dict) 

如果我之前插入調試打印的對像這樣的循環:

print dir(self.model.Meta) 

它沒有列出unqiue_together屬性都:

['__doc__', '__module__', 'abstract'] 

的 '抽象'有點擔心我,但另一個調試打印顯示,我試圖用自然鍵管理的模型不是抽象的:

>>> print self.model.Meta.abstract 
False 

我在很多抽象基類中混合使用。這可能是問題嗎?

class MixedModel(NamedModel, TimeStampedModel, VersionedModel, Model): 
    objects = NaturalKeyModelManager() 

    class Meta: 
     unique_together = (('name', 'version',),) 

爲了完整這裏是混入之一:

class TimeStampedModel(Model): 
    created = DateTimeField(_("Created"),  auto_now_add=True, null=True, editable=False) 
    updated = DateTimeField(_("Updated"),  auto_now=True,  null=True, editable=True) 

    class Meta: 
     abstract = True 

硬編碼模型管理器工作得很好:

class MixedModelManager(Manager): 
    def get_by_natural_key(self, name, version): 
     return self.get(name=name, version=version) 

回答

8

爲了得到傳遞給元的實際選擇,您應該使用self.model._meta而不是self.model.Meta