2013-03-12 27 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