2010-06-25 3 views
0

기본적으로 응답에 첨부 된 모델의 함수를 호출하여 쿼리 세트에 을 주석 처리하는 것과 비슷한 작업을 수행하려고합니다. 그러나을 호출합니다.모델 함수를 사용하여 쿼리 세트에 "주석 달기"를 반환합니다.

현재 내가 좋아하는 뭔가를 : get_state() 외부 웹 서비스를 호출하는 모델의 기능입니다

objs = WebSvc.objects.all().order_by('content_type', 'id') 
for o in objs: 
    o.state = o.cast().get_state() 

. 나는 값을 캐싱의 길을 가고 싶지 않아. 나는 이것을하기위한보다 간결한 방법을 기대하고 있었다.

답변

2

한 가지 방법은 파이썬 속성을 사용하여이 작업을 수행합니다 :

class WebSvc(models.Model): 
    ... 

    def _get_state(): 
     return self.cast().get_state() 

    state = property(_get_state) 

장점 : 속성이 필요한 경우에만 실행됩니다.

가능한 단점 : 속성을 여러 번 호출하면 웹 서비스가 새로 호출됩니다 (필요한 동작 일 수는 있지만 의심 스럽습니다). 메모를 사용하여 캐시 할 수 있습니다.

class WebSvc(models.Model): 
    ... 
    def __init__(*args, **kwargs): 
     super(WebSvc, self).__init__(*args,**kwargs) 
     self.state = self.caste().get_state() 

장점 :

다른 방법은, 그냥 무시 초기화에 의해 그것을 할 경우에만 메모이 제이션에 대한 필요없이 한 번 인스턴스 당 계산됩니다.

가능한 단점 : 각 인스턴스화 된 개체에 대해 계산됩니다.

그러나 대부분의 전형적인 django 경우에는 개체의 속성을 한 번만 실행하기 때문에 .state 속성을 사용하지 않을 개체를 인스턴스화하지 않을 수도 있습니다. 따라서 이러한 경우 접근법은 '성과'에서 다소 유사합니다.

관련 문제