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

私はちょうどこのようなforループの前に、デバッグプリントを挿入した場合:

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を使用してください。
関連する問題