2017-08-07 1 views
3

Prologue:Comment exécuter un GROUP BY ... COUNT ou SUM dans Django ORM?

C'est une question qui se pose souvent SO:

J'ai composé un exemple sur la documentation de SO mais comme la documentation va se fermer le 8 août 2017, je vais suivre la suggestion de this widely upvoted and discussed meta answer et transformer mon exemple en un message auto-répondu.

Bien sûr, je serais plus qu'heureux de voir une approche différente aussi !!


Question:

Assumer le modèle:

class Books(models.Model): 
    title = models.CharField() 
    author = models.CharField() 
    price = models.FloatField() 

Comment puis-je effectuer les requêtes suivantes sur ce modèle en utilisant Django ORM:

  • GROUP BY ... COUNT:

    SELECT author, COUNT(author) AS count 
    FROM myapp_books GROUP BY author 
    
  • GROUP BY ... SUM:

    SELECT author, SUM (price) AS total_price 
    FROM myapp_books GROUP BY author 
    

Répondre

6

Nous pouvons effectuer une GROUP BY ... COUNT ou GROUP BY ... SUM requêtes SQL équivalentes sur Django ORM, avec l'utilisation de annotate(), values(), Count et Sum méthodes du django.db.models respectueusement et facultativement la méthode order_by():

  • GROUP BY ... COUNT:

    result = Books.objects.values('author') 
             .order_by('author') 
             .annotate(count=Count('author')) 
    

    se soldent maintenant par contient un dictionnaire avec deux clés: author et count:

    author | count 
    ------------|------- 
    OneAuthor | 5 
    OtherAuthor | 2 
        ...  | ... 
    
  • GROUP BY ...SOMME:

    result = Books.objects.values('author') 
             .order_by('author') 
             .annotate(total_price=Sum('price')) 
    

    se soldent maintenant par contient un dictionnaire avec deux colonnes: author et total_price:

    author | total_price 
    ------------|------------- 
    OneAuthor | 100.35 
    OtherAuthor |  50.00 
        ...  |  ...