2010-11-05 15 views
1

J'ai du mal à comprendre comment utiliser les annotations dans l'ORM de Django pour réaliser un regroupement à travers un modèle.Django Annotations pour groupe par un autre modèle

from django.db import models 

class Customer(models.Model): 
    name = models.CharField(max_length=255) 

class Store(models.Model): 
    name = models.CharField(max_length=255) 

class Order(models.Model): 
    customer = models.ForeignKey(Customer) 
    store = models.ForeignKey(Store) 
    order_date = models.DateTimeField() 

Si mes magasins sont Los Angeles, Denver, Houston & Atlanta, comment puis-je obtenir un compte de clients en magasin en utilisant la dernière date de commande?

Los Angeles: 25 
Denver: 210 
Houston: 400 
Atlanta: 6 

Répondre

0

définir un champ ManyToMany sur soitCustomer ou Store, montrant l'autre modèle, avec Order que la table through. Par exemple:

class Store(models.Model): 
    name = models.CharField(max_length=255) 
    orders = models.ManyToManyField(Customer, through=Order) 

Maintenant, vous pouvez faire:

from django.db.models import Count 
Store.objects.annotate(Count("orders__customer")) 
+0

Comment cela s'assurer qu'elle est seulement la dernière order_date qui est utilisé pour la requête? – RyanBrady

+0

Dernier 'order_date' signifie un seul ordre - est-ce que vous voulez dire? –

+0

oui..je veux seulement compter la dernière commande. Si vous avez magasiné à Denver la semaine dernière et Houston cette semaine, je veux seulement vous compter pour Houston. – RyanBrady