美文网首页
model之F/Q操作

model之F/Q操作

作者: 马小跳_ | 来源:发表于2017-12-19 21:37 被阅读17次
    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)
    

    相关文章

      网友评论

          本文标题:model之F/Q操作

          本文链接:https://www.haomeiwen.com/subject/jyoiwxtx.html