2014-11-25 1 views
0

을 감안할 때 그 모델 :Django의 ORM을 사용하여 하위 쿼리를 사용하여 집계를 검색하는 방법?

from django.conf import settings 
from django.contrib.auth import get_user_model 
from django.db import models 


class UserProfile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL) 
    related_to = models.ForeignKey(
     settings.AUTH_USER_MODEL, blank=True, null=True, related_name='profile') 
    # a few other fields 


class Metric(models.Model): 
    user = models.ForeignKey(
     settings.AUTH_USER_MODEL, verbose_name='user', related_name='metrics') 
    value = models.FloatField(verbose_name='value') 
    target = models.FloatField(verbose_name='target value', default=0) 
    date_measured = models.DateField(verbose_name='date measured') 

사용자는 부모 - 자녀 관계로, 다른 사용자에게 관련 될 수있다.

ORM을 사용하여 메트릭 (합계 값과 합계)의 합계를 사용하여 모든 사용자의 하위를 가장 잘 검색하는 방법은 무엇입니까? 이 RAW SQL과 유사한

뭔가 :

items = get_user_model().objects \ 
    .filter(userprofile__related_to__id=1) \ 
    .annotate(
     meta=Sum('metric__meta'), 
     value=Sum('metric__value'), 
    ) \ 

답변

0

생각에 좀 더 쉽게 할 수있다 :

SELECT `auth_user`.`id`, 
     `auth_user`.`username`, 
     `mf`.`meta`, 
     `mf`.`value` 
FROM `auth_user` 
LEFT JOIN 
    (SELECT `metric`.`user_id`, 
      SUM(`metric`.`meta`) AS `meta`, 
      SUM(`metric`.`value`) AS `value` 
    FROM `metric` 
    INNER JOIN `userprofile` ON (`userprofile`.`user_id` = `metric`.`user_id`) 
    GROUP BY `metric`.`user_id`) mf ON (`auth_user`.`id` = mf.`user_id`) 
WHERE `auth_user`.`id` = 1 

이 작동하지 않습니다 (그렇지 사용자가 통계의 집계를 생산) 이 이름을 변경하는 경우 related_toparent_userprofilechild_profiles에 :

class UserProfile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL) 
    parent_user = models.ForeignKey(
     settings.AUTH_USER_MODEL, blank=True, null=True, related_name='child_profiles') 
    ... 
,

그러면 다음과 같이 할 수 있습니다.

metric_sums = Metric.objects.filter(
    user__userprofile__parent_user_id=1).annotate(
     meta=Sum('meta'), 
     value=Sum('value')) 
+0

이렇게했습니다. 감사! –