2013-03-12 5 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 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 MixedModel(NamedModel, TimeStampedModel, VersionedModel, Model): 
    objects = NaturalKeyModelManager() 

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

여기 유지 mixin 중 하나

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을 사용해야합니다.