2009-09-30 4 views
2

Puis-je chaîner ces deux ensembles de query en un?Django ORM: chaînage des querysets agrégés en un

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'), 

Tout ce que je veux, ce sont les colonnes value_1 et value_2. Les objets Q ne sont pas ce dont j'ai besoin. Peut-être que l'ORM ne supporte pas cela.

Répondre

1

Je suggère d'utiliser Q objects pour remplacer votre filtre pour date__gt et date__lt

Exemple (non testé):

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') 

Cela devrait retourner à la fois les dates que vous recherchez.

+0

Merci Tom mais ce n'est pas ce que je cherche. value_1 et value_2 totalisent toutes les valeurs gbp_s par mois. Comment puis-je chaîner ces deux querysets d'agrégats? – orwellian

2

Vous pouvez combiner des jeux de requête à l'aide de | et & opérateurs:

# 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 
[] 

Source http://www.djangoproject.com/documentation/models/basic/

+0

C'est un joli petit régal! – jathanism

Questions connexes