假设模型名字为Book,字段有id,name(char),page_nums(int),publication_date(datatime), readcount(int), commentcount(int)
1.基础查询
Book.objects.get(id=1) Book.objects.filter(page_num > 100) Book.objects.all() /Book.object.count()
2.模糊查询
# 书名包含“西游” Book.objects.filter(name__contains='西游') # 书名以“龙”开头 Book.objects.filter(name__startswith='龙') # 书名以“族”结尾 Book.objects.filter(name__endswith='族')
3.范围,比较,空查询
gt大于 (greater then) gte大于等于 (greater then equal) lt小于 (less then) lte小于等于 (less then equal) Book.objects.filter(id__in=[1,3,5]) Book.objects.filter(id__gt=3) Book.objects.filter(name__isnull=True)
4.日期查询
查询2019年发行的图书
Book.objects.filter(publication_date__year=2019)
查询2018年以后发行的图书
Book.objects.filter(pub_date__gt='2018-1-1')
5.F对象与Q对象
from django.db.models import F, Q
常用查询为与常量的比较,当本身的两个属性进行比较时需要用到F对象,例如查询阅读量大于评论量的书籍
Book.objects.filter(readcount__gt=F('commentcount'))
而且可以进行运算,例如阅读量大于五倍评论量的书籍
Book.objects.filter(readcount__gt=F('commentcount')*5)
当表示多个过滤器之间的联合查询时,“and”可以正常查询,但“or”需要使用Q对象,例如 阅读量大于1000且发行时间为2018年以后 Book.objects.filter(readcount__gt=1000, publication_date__gt='2018-1-1') / Book.objects.filter(readcount__gt=1000).filter(publication_date__gt='2018-1-1')
表示"或"时只能使用Q对象 阅读量大于1000或评论量大于200 Book.objects.filter(Q(readcount__gt=1000)|Q(commentcount__gt=200))
Q对象可以再前面加上一个“~”表示“非”,例如,发行时间不是2019年的图书
Book.objects.filter(~Q(publication_date__year=2019))
6.聚合查询与排序
Avg平均,Count数量,Max最大,Min最小,Sum求和 调用聚合函数需要使用aggregate()过滤器,其返回值为一个字典类型,但Count一般不使用,例如, from django.db.models import Sum, Avg, Count, Max, Min 查询阅读量的总和,返回为字典 Book.objects.aggregate(Sum('readcount')) >>> {'readcount__sum': 12345} 查询一共有多少本书,返回为数字 Book.objects.count() / Book.objects.all().count() >>> 123
按照阅读量排序,降序可以在查询字段前面加上一个“-”来表示
Book.objects.all()。order_by("readcount")
Book.objects.all()。order_by("-readcount")
7.关联查询
当模型使用外键时就就需要使用关联查询,这里添加一张新的关联表-作者一个作者对应多个图书:Author [id, name(char), book(ForeignKey)]
由一到多的访问语法:一对应的模型类对象.多对应的模型类名小写_set,例如
查询名字为裟椤双树作者的所有书籍,将返回一个包含所有书籍对象的查询集
>>> author = Author.objects.get(name=“裟椤双树”)
>>> author.book_set.all()
由多到一的访问语法:多对应的模型类对象.多对应的模型类中的关系类属性名
查询浮生物语书籍的作者
book= Book.objects.get(name=“浮生物语”)
book.author
关联过滤查询
8.Django中外键详解
9.Django中的查询集(QuerySet)介绍