model之F/Q操作

2017-12-19  本文已影响17人  马小跳_
from django.db.models import F,Q

F操作,使用查询条件的值

打个比方吧,有一张表,保存着公司员工的工资,公司普涨工资,如何在model中操作,这就用到了F

models.UserInfo.objects.filter().update(salary=F('salary')+500)

Q操作,构造复杂的搜索条件

model中的查询搜索有三种方式:

传参数

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)
上一篇下一篇

猜你喜欢

热点阅读