2

에 따라 집계 값으로 모델을 주석 :장고의 내가 다음과 같은 모델 구조 있다고 가정 해 봅시다 쿼리

  1. : 나는 부모 ViewSet에서에 노력하고있어

    Parent(): 
    
    Child(): 
    parent = ForeignKey(Parent) 
    
    GrandChild(): 
    child = ForeignKey(Child) 
    state = BooleanField() 
    num = FloatField() 
    

    을 다음과 같이 복구 자녀의 수.

  2. 'state'가 True이면 'num'필드의 합계입니다.

나는 다음을 수행 할 수 있습니다 :이 날을 제공

queryset = Parent.objects\ 
    .annotate(child_count=Count('child'))\ 
    .annotate(sum_total=Sum('child__grandchild__num')) 

(1) 대신 (2) 나에게 모든 손자의 SUM을 제공 중. 손자를 적절하게 필터링하면서 Parent 개체가 모두 QuerySet에 있는지 확인하려면 어떻게해야합니까?

답변

1

은 주석

queryset = Parent.objects.filter(child__grandchild__state=True')\ 
    .annotate(child_count=Count('child'))\ 
    .annotate(sum_total=Sum('child__grandchild__num')) 
+0

그럴 수는 있지만 모든 부모 개체가 있는지 확인해야합니다. 죄송합니다. 초기 질문을 수정하겠습니다. – Eric

+0

@Eric 당신은 이것으로부터 부모 객체 쿼리 세트를 얻을 것이다. –

+0

특정 부모에게 GrandChild가없는 경우는 어떻게됩니까? – Eric

0

사용하는 장고의 버전 전에 필터를 사용해보십시오? 버전이 지원되는 경우 하위 쿼리도 사용할 수 있습니다.

Parent.objects 
.annotate(child_count=Count('child')) 
.annotate(
    grandchild_count_for_state_true=Subquery(
     GrandChild.objects.filter(
      state=True, 
      child=OuterRef('pk') 
     ).values('parent') 
     .annotate(cnt=Sum('child__grandchild__num')) 
     .values('cnt'), 
     num=models.IntegerField() 
    ) 
) 

집계 쿼리를 통해이를 최적화 할 수 있습니다.

+0

하위 쿼리가 내가 따라야 할 경로 일 수 있지만 사용자의 대답이 올바르지 않을 수 있습니다. 1. 나는 합계가 아니라 백작을 찾고 있습니다. 2. '이벤트'라는 모델이 없습니다. 3. 'num'필드는 IntegerField가 아닌 FloatField입니다. – Eric

관련 문제