classPublish(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) city = models.CharField(max_length=32) email = models.EmailField()
classAuthor(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.IntegerField() author_detail = models.OneToOneField(to='AuthorDetail', to_field='nid', unique=True, on_delete=models.CASCADE)
''' 标准 annotate() 内写聚合函数 values在前 表示 group by 的字段 values在后 表示取字段 filter在前 表示where条件 filter在后 表示having '''
# 查询每一个出版社id,以及出书平均价格(单表) # select publish_id,avg(price) from book group by publish_id; res = models.Book.objects.values('publish_id').filter(publish_id__gt=1).annotate(price_ave=Avg('price')).values('publish_id', 'price_ave') print(res)
# 查询出版社id大于1的出版社id,以及出书平均价格大于60的 res = models.Book.objects.values('publish_id').filter(publish_id__gt=1).annotate(price_avg=Avg('price')).filter(price_avg__gt=60).values('publish_id') print(res)
# 查询每一个出版社出版的名称和书籍个数(连表) res = models.Book.objects.values('publish_id').annotate(book_count=Count('nid')).values('publish__name','book_count') print(res)
## 联表的话最好以group by的表作为基表 res = models.Publish.objects.values('nid').annotate(book_count=Count('book__nid')).values('nid','book_count') print(res) ## 简写成,如果基表是group by的表,就可以不写values res = models.Publish.objects.annotate(book_count=Count('book')).values('name','book_count')
# 以book为基表 res = models.Book.objects.values('publish__nid').annotate(book_count=Count('nid')).values('publish__name','book_count') print(res)
# 查询每个作者的名字,以及出版过书籍的最高价格(建议使用分组的表作为基表) # 多对多如果不以分组表作为基表,可能会出数据问题 res = models.Author.objects.values('name').annotate(max_price=Max('book__price')).values('name', 'max_price') print(res)
# 查询每一个书籍的名称,以及对应的作者个数 res = models.Book.objects.values('name').annotate(author_count=Count('authors')).values('name','author_count') print(res)
# 统计不止一个作者的图书 res = models.Book.objects.values('name').annotate(author_count=Count('authors')).filter(author_count__gt=1).values('name') print(res)
# 统计价格数大于10元,作者个数大于1的图书 res = models.Book.objects.filter(price__gt=10).values('name').annotate(author_count=Count('authors')).filter(author_count__gt=1).values('name') print(res)
# raw 后直接使用原生SQL语句 from app01 import models res = models.Author.object.raw('select * from app01_author where nid > 1') for author in res: print(author) # 执行SQL语句时 和对象类型无光了,查出什么字段直接使用该字段 res = models.Author.object.raw('select * from app01_book where nid > 1') for book in res: print(book)