2012-06-22 3 views
1

를 추가 I는 다음과 같습니다 장고 모델이있다.장고 사용자 정의 관리자 속성

나는 기능 (모든, 필터, 등, 수)의 의해 반환되는 모든 값에 대한 다음과 같은 작업을 수행하는 사용자 정의 관리자를 원하는 :

value.nonDbField = SomeObject.objects.get(pk=value.field1) 

내가 직접 같이 얻을 오버라이드 (override) 할 수있는 테스트 한 그래서 :

class MyCustomManager(models.Manager): 
    def get(self, *args, **kwargs): 
     value = super(MyCustomManager, self).get(*args, **kwargs) 
     value.nonDbField = SomeObject.objects.get(listid=value.itemListID) 
     return value 

그러나 모든 기능에 걸쳐 더 쉬운 방법이 있는지 궁금해했습니다.

당신은 "너 왜 이러는거야?"라고 말할 것입니다. 레거시이지만 여전히 활성 인 데이터베이스의 모델 상속과 관련이 있습니다.

답변

2

당신은 당신이 뭔가를 시도 할 수 필드 1 (또는 모델의 다른 필드)에 관련이있는 것으로 nonDbField의 값을해야하는 경우 :

:

Class MyModel(models.Model): 

    # your fields here... 

    def _nonDbField(self): 
     return SomeObject.objects.get(pk=self.field1) 
    nonDbField = property(_nonDbField) 

이것은 당신이 이런 일을 수행 할 수 있습니다

MyModel.objects.get(pk=1).nonDbField 

nonDbField (데이터베이스 성능에 좋지 않을 수도 있음)에 액세스 할 때마다 데이터베이스 쿼리를 작성한다는 점에 유의하십시오.

+1

Brilliant! 그냥 내가 필요한 것, 감사합니다! – Jonathan