仅仅靠单一的关键字参数查询已经很难满足查询要求。此时Django为我们提供了F和Q查询:
1 # F 使用查询条件的值,专门取对象中某列值的操作
2
3 # from django.db.models import F
4 # models.Tb1.objects.update(num=F('num')+1)
5
6
7 # Q 构建搜索条件
8 from django.db.models import Q
9
10 #1 Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询
11 q1=models.Book.objects.filter(Q(title__startswith='P')).all()
12 print(q1)#[<Book: Python>, <Book: Perl>]
13
14 # 2、可以组合使用&,|操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。
15 Q(title__startswith='P') | Q(title__startswith='J')
16
17 # 3、Q对象可以用~操作符放在前面表示否定,也可允许否定与不否定形式的组合
18 Q(title__startswith='P') | ~Q(pub_date__year=2005)
19
20 # 4、应用范围:
21
22 # Each lookup function that takes keyword-arguments (e.g. filter(),
23 # exclude(), get()) can also be passed one or more Q objects as
24 # positional (not-named) arguments. If you provide multiple Q object
25 # arguments to a lookup function, the arguments will be “AND”ed
26 # together. For example:
27
28 Book.objects.get(
29 Q(title__startswith='P'),
30 Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
31 )
32
33 #sql:
34 # SELECT * from polls WHERE question LIKE 'P%'
35 # AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
36
37 # import datetime
38 # e=datetime.date(2005,5,6) #2005-05-06
39
40 # 5、Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。
41 # 正确:
42 Book.objects.get(
43 Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
44 title__startswith='P')
45 # 错误:
46 Book.objects.get(
47 question__startswith='P',
48 Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))
参考来源:https://www.cnblogs.com/liuwchao/articles/9831942.html