F对象和Q对象详解

F对象

  • 可以使用模型的字段A与字段B进行比较,如果A写在了等号的左边,则B出现在等号的右边,需要通过F对象构造;

list.filter(bread__gte=F(‘bcommit’))
django支持对F()对象使用算数运算
list.filter(bread__gte=F(‘bcommit’)*2)
F()对象中还可以写作”模型类__列名”进行关联查询
list.filter(isDelete=F(‘heroinfo__isDelete’))
对于date/time字段,可与timedelta()进行运算
list.filter(bpub_date__lt=F(‘bpub_date’)+timedelta(days=1))

Q对象

  • Q对象实例化后能够增加各个条件之间的关系,而且这种写法用在你不知道用户到底传入了多少个参数的时候很方便。
  • 比如默认情况下filter()里面每个字段的连接都是&,我们使用Q对象通常都是让它变成|,来进行查询 。
from django.db.models import Q

query = Q()
q1 = Q()
q1.connector = "AND"  # 连接的条件是AND 代表就是& 
q1.children.append(("email", "[email protected]")) # email代表的是数据库的字段
q1.children.append(("password", "666"))
 # 等同于:email="[email protected]" & password="666"
q2 = Q()
q2.connector = "AND"  # 同样q2对象连接条件也是AND 
q2.children.append(("username", "fe_cow")) # 同样数据库里username字段
q2.children.append(("password", "fe_cow666"))
 # 等同于:username="fe_cow" & password="fe_cow666"
query.add(q1, "OR") 
query.add(q2, "OR")
 # query目前里面的符合条件结果就是: (email="[email protected]" & password="666") |  (username="fe_cow" & password="fe_cow666")
userinfo_obj = models.UserInfo.objects.filter(query).first()
  • 过滤器的方法中关键字参数查询,会合并为And(),需要进行or查询,使用Q()对象,Q对象(django.db.models.Q)用于封装一组关键字参数,这些关键字参数与”比较运算符”中的相同 。
from django.db.models import Q 
list.filter(Q(pk__lt=6))
  • Q对象可以使用&(and)、|(or)、操作符组合起来,当操作符应用在两个Q对象时,会产生一个新的Q对象。
list.filter(pk__lt=6).filter(bcomment__gt=10) 
list.filter(Q(pk__lt=6) | Q(bcomment__gt=10))
  • 使用~(not)操作符在Q对象前表示取反
list.filter(~Q(pk__lt=6))
  • 可以使用&|~结合括号进行分组,构造出复杂的Q对象

你可能感兴趣的:(Django)