from django.db import models
 
 
 class Book(models.Model):
     """图书模型"""
     name = models.CharField(max_length=300)
     pages = models.IntegerField()
     price = models.FloatField()
     rating = models.FloatField()
     author = models.ForeignKey(Author,on_delete=models.CASCADE)
     publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)     
     
     class Meta:
         db_table = 'book'
 
 
 class BookOrder(models.Model):
     """图书订单模型"""
     book = models.ForeignKey("Book",on_delete=models.CASCADE)
     price = models.FloatField()     
     
     class Meta:
         db_table = 'book_order'
 
 
 from django.db.models import Count, Sum
 result = Book.objects.aggregate(book_num=Count('id'))
 result = Book.objects.annotate(total=Sum("bookorder__price")).values("name","total")

 

aggregate和annotate的区别:

aggregate:返回使用聚合函数后的字段和值。

annotate:在原来模型字段的基础上每个对象都添加一个使用查询表达式(聚合函数、F表达式、Q表达式、Func表达式等)的新字段,并且在使用聚合函数的时候,会使用当前这个模型的主键进行分组(group by)。

比如以上Sum的例子,如果使用的是aggregate,将求所有图书的销售总额。如果使用的是annotate,将在每本书的数据上都添加一个叫做total的字段,计算这本书的销售总额。