Django GROUB BY ... COUNT / SUM Django équivalent ORM


Exemple

Nous pouvons effectuer une GROUP BY ... COUNT ou un GROUP BY ... SUM requêtes SQL équivalent sur Django ORM, avec l'utilisation de annotate() , les values() , order_by() et les django.db.models s » Count et Sum méthodes respectueusement:

Laissez notre modèle être:

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

GROUP BY ... COUNT :

  • Supposons que nous voulons compter le nombre d'objets du livre par auteur distinct dans notre tableau Books :

    result = Books.objects.values('author')
                          .order_by('author')
                          .annotate(count=Count('author'))
    
  • Le result contient maintenant un jeu de requête avec deux colonnes: author et count :

      author    | count
    ------------|-------
     OneAuthor  |   5
    OtherAuthor |   2
       ...      |  ...
    

GROUB BY ... SUM :

  • Supposons que nous voulons faire la somme du prix de tous les livres par auteur distinct qui existent dans notre tableau Books :

     result = Books.objects.values('author')
                           .order_by('author')
                           .annotate(total_price=Sum('price'))
    
  • Maintenant, le result contient un ensemble de requêtes avec deux colonnes: author et total_price :

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