2009-09-30 4 views
2

Можно ли связать эти два запроса в одном?Django ORM: объединение агрегированных запросов в один

qs1 = OrderTicket.objects.filter(date__gt=datetime.date(2009, 1, 1), date__lt=datetime.date(2009, 1, 30)).values('order_type').annotate(value_1 = Sum('gbp_value')).order_by('order_type'), 
qs2 = OrderTicket.objects.filter(date__gt=datetime.date(2009, 2, 1), date__lt=datetime.date(2009, 2, 30)).values('order_type').annotate(value_2 = Sum('gbp_value')).order_by('order_type'), 

Все, что я хочу, это столбцы value_1 и value_2. Объекты Q не то, что мне нужно. Возможно, ORM не поддерживает это.

ответ

1

Я предложил бы использовать Q objects заменить фильтр для date__gt и date__lt

Пример (не проверено):

qs1 = OrderTicket.objects 
    .filter( Q(date__gt=datetime.date(2009, 1, 1), date__lt=datetime.date(2009, 1, 30)) 
      | Q(date__gt=datetime.date(2009, 2, 1), date__lt=datetime.date(2009, 2, 30)) 
      ) 
    .values('order_type').annotate(value_1 = Sum('gbp_value')).order_by('order_type') 

Это должно вернуться и даты вы ищете.

+0

Спасибо Том, но это не то, что я ищу. value_1 и value_2 суммирует все значения gbp_values ​​за соответствующий месяц. Как я могу связать эти два совокупных запроса? – orwellian

2

Вы можете комбинировать запросы с помощью | и & операторы:

# You can combine queries with & and |. 
>>> s1 = Article.objects.filter(id__exact=1) 
>>> s2 = Article.objects.filter(id__exact=2) 
>>> s1 | s2 
[<Article: Area woman programs in Python>, <Article: Second article>] 
>>> s1 & s2 
[] 

Источник http://www.djangoproject.com/documentation/models/basic/

+0

Это хорошее удовольствие! – jathanism