F和Q对象

F对象

  • 之前的查询都是模型对象的属性与常量值比较,两个属性怎么比较呢?
  • 答:使用F对象

F对象语法:

from django.db.models import F

F('属性名')

F对象查询需求

# 1.查询阅读量大于评论量的书籍
# 2.查询阅读量大于2倍评论量的书籍
  • 1.查询阅读量大于评论量的书籍

      bookInfos = BookInfo.books.filter(readcount__gt=F('commentcount'))
    
  • 2.查询阅读量大于2倍评论量的书籍 : F对象支持运算

      bookInfos = BookInfo.books.filter(readcount__gt=F('commentcount')*2)
    

Q对象

多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字

  • 例:查询阅读量大于20,并且编号小于3的图书

      bookInfos = BookInfo.books.filter(readcount__gt=20,id__lt=3)
      或
      bookInfos = BookInfo.books.filter(readcount__gt=20).filter(id__lt=3)
    

如果需要实现逻辑或的查询(or),需要使用Q()对象结合|运算符

Q对象语法:

from django.db.models import Q

Q(模型属性1__条件运算符=值) | Q(模型属性2__条件运算符=值)

Q对象查询需求

# 1.查询阅读量大于20,或编号小于3的图书
# 2.查询编号不等于3的书籍
  • 1.查询阅读量大于20,或编号小于3的图书

      bookInfos = BookInfo.books.filter(Q(readcount__gt=20) | Q(id__lt=3))
    
  • 2.查询编号不等于3的书籍 (Q对象前可以使用~操作符,表示非not)

      bookInfos = BookInfo.books.filter(~Q(id=3))
      或
      bookInfos = BookInfo.books.exclude(id=3)