0 votes

Comment obtenir quelque chose comme des clients réguliers dans Django ?

Mes modèles ressemblent à ceci :

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

class Order(models.Model):
   customer = models.ForeignKey(Customer)
   date = models.DateField()
   total = models.DecimalField(max_digits=5, decimal_places=2)

J'ai ensuite un queryset de commandes :

from datetime import datetime

start_date = datetime(year=2009, month=6, day=1)
end_date = datetime(year=2009, month=11, day=1)
orders = Order.objects.filter(date__lte=end_date).filter(date__gte=start_date)

Maintenant, je veux savoir quels clients ont passé plusieurs commandes entre ces deux moments, combien de commandes ils ont passées et quel est leur total moyen. J'ai l'impression que je devrais utiliser les nouvelles fonctionnalités d'agrégation de Django 1.1, mais je n'arrive pas à m'y retrouver.

1voto

SmileyChris Points 5405

Basez toujours votre recherche sur l'objet qui vous intéresse en premier lieu :

repeat_customers = Customer.objects.annotate(order_count=Count('order'))\
                                   .filter(order_count__gt=1)

Ensuite, si vous voulez annoter avec leurs totaux (vous pourriez alternativement faire cela dans l'annotation ci-dessus, je sépare juste le code pour la lisibilité) :

repeat_customers = repeat_customers.annotate(avg_total=Avg('order__total'))

0voto

Soviut Points 26384

Il s'agirait d'une bonne utilisation de la fonction de Django 1.1 annotate() qui fait partie de agrégation . Plus précisément, vous voudrez probablement utiliser l'option values() fonction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X