一、F查询
1 rom django.db.models import F 2 from app01.models import Book 3 Book.objects.update(price=F("price")+20) # 对于book表中每本书的价格都在原价格的基础上增加20元
就这样一条简单的语句就完成了对表中所有商品价格的更新,是不是很方便!如果没有F查询,你首先要获取原价格,再做一个算术运算,然后更新字段。F查询专门对对象中某列值的操作,不可使用__双下划线!
二、Q查询
Q查询可以组合使用 “&”, “|” 操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象,Q对象可以用 “~” 操作符放在前面表示否定,也可允许否定与不否定形式的组合。Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。
1 from django.db.models import Q 2 3 print(Book.objects.filter(Q(id=3))[0]) # 因为获取的结果是一个QuerySet,所以使用下标的方式获取结果 4 print(Book.objects.filter(Q(id=3)|Q(title="Go"))[0]) # 查询id=3或者标题是“Go”的书 5 print(Book.objects.filter(Q(price__gte=70)&Q(title__startswith="J"))) # 查询价格大于等于70并且标题是“J”开头的书 6 print(Book.objects.filter(Q(title__startswith="J") & ~Q(id=3))) # 查询标题是“J”开头并且id不是3的书 7 print(Book.objects.filter(Q(price=70)|Q(title="Python"), publication_date="2017-09-26")) # Q对象可以与关键字参数查询一起使用,必须把普通关键字查询放到Q对象查询的后面
1 from django.db.models import Q 2 3 con = Q() 4 q1 = Q() 5 q1.connector = "AND" 6 q1.children.append(("email", "123@qq.com")) 7 q1.children.append(("password", "abc123")) 8 9 q2 = Q() 10 q2.connector = "AND" 11 q2.children.append(("username", "abc")) 12 q2.children.append(("password", "xyz123")) 13 14 con.add(q1, "OR") 15 con.add(q2, "OR") 16 17 obj = models.UserInfo.objects.filter(con).first() 18 19 # 查询email=123@qq.com和password=abc123 或者 username=abc和password=xyz123的用户信息