from django.db.models import F,Q
F操作,使用查询条件的值
打个比方吧,有一张表,保存着公司员工的工资,公司普涨工资,如何在model中操作,这就用到了F
models.UserInfo.objects.filter().update(salary=F('salary')+500)
Q操作,构造复杂的搜索条件
model中的查询搜索有三种方式:
- 传参数
- 传字典
- 传Q对象
传参数
models.UserInfo.objects.filter(id=3,name='alex')
传字典
需要注意的是,传入字典时,字典前面需要加**
,作为解包
dic = {'id':123,'name':'alex'}
models.UserInfo.objects.filter(**dic)
所以我们可以在在捕捉用户输入后,将输入构造成字典,然后将字典当做参数传入查询.
传Q对象,构造搜索条件
方式一,使用连接符:
Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询。可以组合使用 &(and),|(or),~(not)操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。
Order.objects.get(
Q(desc__startswith='Who'),
Q(create_time=date(2016, 10, 2)) | Q(create_time=date(2016, 10, 6))
)
转换成sql语句,大致如下:
SELECT * from core_order WHERE desc LIKE 'Who%' AND (create_time = '2016-10-02' OR create_time = '2016-10-06')
Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。
正确写法:
Order.objects.get(
Q(create_time=date(2016, 10, 2)) | Q(create_time=date(2016, 10, 6))
desc__startswith='Who',
)
错误写法:
Order.objects.get(
desc__startswith='Who',
Q(create_time=date(2016, 10, 2)) | Q(create_time=date(2016, 10, 6))
)
Q对象可以用~操作符放在前面表示否定,也可允许否定与不否定形式的组合
Q(question__startswith='Who') | ~Q(pub_date__year=2005)
方式二,使用Q对象方法:
q1 = Q()
q1.connector = 'OR' # 不写默认为and
q1.children.append(('id', 1))
q1.children.append(('id', 2))
q1.children.append(('id', 3))
models.Tb1.objects.filter(q1)
合并条件进行查询:
con = Q()
q1 = Q()
q1.connector = 'or'
q1.children.append( ('name','alex1') )
q1.children.append( ('name','alex2') )
q2 = Q()
q2.connector = 'and'
q2.children.append( ('age__gt',18))
q2.children.append( ('id__gt',18))
con.add(q1,'OR')
con.add(q2,'OR')
# (name='alex' or name=='alex2') or (age>18 and id > 18)
queryset = self.model_class.objects.filter(con)