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的字段,计算这本书的销售总额。