Django: 使用 Q 对象构建复杂的查询语句

官方文档: https://docs.djangoproject.com/en/2.2/topics/db/queries/

1、all() : 查询所有结果
2、filter()
3、get(**kwargs)
4、exclude(**kwargs)
5、value(*field)
6、values_list(*field)
7、order_by(*field)
8、reverse():
9、distinct():
10、count()
11、first():
12: last():
13: exists():
 

F 查询:  https://docs.djangoproject.com/en/2.0/ref/models/expressions/

注意红色部分加上括号

             tabledata = Incident.objects.filter((Q(customer=acc) & Q(group=self.dict["AIATWUNIXIN"]) | Q(group=self.dict["AIATWWININ"]) | Q(group=self.dict["AIACNIN"]) |Q(group=self.dict["AIACNDBA"])| Q(group=self.dict["AIATWDATA"])| Q(group=self.dict["AIATWMW"])| Q(group=self.dict["AIATWSTOR"])| Q(group=self.dict["AIATSSTECH"])) | (Q(customer=acc) & (Q(iownergroup=self.dict["AIATWUNIXIN"]) | Q(iownergroup=self.dict["AIATWWININ"]) | Q(iownergroup=self.dict["AIACNIN"]) |Q(iownergroup=self.dict["AIACNDBA"])| Q(iownergroup=self.dict["AIATWDATA"])| Q(iownergroup=self.dict["AIATWMW"])| Q(iownergroup=self.dict["AIATWSTOR"])| Q(iownergroup=self.dict["AIATSSTECH"]) & Q(group="")))).filter(Q(inature="Request")).values()
               

             tabledata = Incident.objects.filter((Q(customer=acc) & Q(inature="Request") & (Q(group=self.dict["AIATWUNIXIN"]) | Q(group=self.dict["AIATWWININ"]) | Q(group=self.dict["AIACNIN"]) |Q(group=self.dict["AIACNDBA"])| Q(group=self.dict["AIATWDATA"])| Q(group=self.dict["AIATWMW"])| Q(group=self.dict["AIATWSTOR"])| Q(group=self.dict["AIATSSTECH"]))) | ((Q(customer=acc) & Q(inature="Request")) & (Q(group="") & Q(iownergroup=self.dict["AIATWUNIXIN"]) | Q(iownergroup=self.dict["AIATWWININ"]) | Q(iownergroup=self.dict["AIACNIN"]) |Q(iownergroup=self.dict["AIACNDBA"])| Q(iownergroup=self.dict["AIATWDATA"])| Q(iownergroup=self.dict["AIATWMW"])| Q(iownergroup=self.dict["AIATWSTOR"])| Q(iownergroup=self.dict["AIATSSTECH"])))).values()

ids = user.objects.filter(NAME=username).values('CNUM') 返回  a QuerySet

可以遍历:

        username = user.objects.get(CNUM=userid).NAME
        ids = user.objects.filter(NAME=username).values('CNUM') 
        for unid in ids:
          uid = unid['CNUM']
          #checkstat.objects.filter(checkerid=checkerid, userid=userid).update(stats="Y")
          checkstat.objects.filter(checkerid=checkerid, userid=uid).update(stats="Y")
        p = checker.objects.get(ID=checkerid)
        usere = user.objects.get(CNUM=userid).Email

但是, usere = user.objects.get(CNUM=userid).Email,  使用get()只能返回一个对象, 如果有多个对象,会raise MultipleObjectsReturned

      userid = request.POST.get("uid")
      if confirmreply == "y":
        checkstat.objects.filter(checkerid=checkerid, userid=userid).update(stats="Y")
        p = checker.objects.get(ID=checkerid)
        usere = user.objects.get(CNUM=userid).Email
        to_mail = []
        to_mail.append(usere)
        body = "Congratulations!! You have completed " + p.Type + ": " + p.Name

   D=Changes.objects.all().values("chnum")
   print(D)        #返回的itorable对象,可以用循环遍历,且只返回查询的key和value

    for chdata in D:  #chdata为 {'chnum': 'CHG0072026'}
        if chdata['chnum'] not in CHNUM:
            Changes.objects.filter(chnum=chdata['chnum']).delete()
    D33=Changes.objects.values("chnum")
    print(D33)
    for chdata in D:
        if chdata['chnum'] not in CHNUM:
            Changes.objects.filter(chnum=chdata['chnum']).delete()

[root@oc1152622168 aia]# /bin/python3 /home/cictest/jhpengsz/icdreport-0429.19/manage.py crontab run 46ece4623bb3e00f02ffaae493c65c52

得到的结果是一样的
<QuerySet [{'chnum': 'CHG0072026'}, {'chnum': 'CHG0088573'}, {'chnum': 'CHG0134103'}, '...(remaining elements truncated)...']>
<QuerySet [{'chnum': 'CHG0072026'}, {'chnum': 'CHG0088573'}, {'chnum': 'CHG0134103'}, '...(remaining elements truncated)...']>
 

    acciter = icdaccount.objects.all().values()
    print(acciter)


而icdaccount.objects.all().values() 可以得到以下iterable:
<QuerySet [{'id': 1, 'account': 'ea', 'intraaddr': 'shensh@cn.ibm.com'}]>


AND 查询
OR 查询
NOT 查询
与关键字参数共用
OR, AND, NOT 多条件查询
动态构建查询条件
参考资料
本文将讲述如何在 Django 项目中使用 Q 对象构建复杂的查询条件。 假设有如下的 model:

    class Question(models.Model):
        question_text = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date published')

然后我们创建了一些数据:

    Question.objects.create(
        question_text='what are you doing',
        pub_date=datetime.datetime(2015, 11,7)
    )
    Question.objects.create(
        question_text='what is wrong with you',
        pub_date=datetime.datetime(2014, 11, 7)
    )
    Question.objects.create(
        question_text='who are you',
        pub_date=datetime.datetime(2015, 10, 7)
    )
    Question.objects.create(
        question_text='who am i',
        pub_date=datetime.datetime(2014, 10, 7)
    )
    
    >>> Question.objects.all()
    [<Question: what are you doing>, <Question: what is wrong with you>,
     <Question: who are you>, <Question: who am i>]

AND 查询
将多个 Q 对象作为非关键参数或使用 & 联结即可实现 AND 查询:

    >>> from django.db.models import Q

# Q(...)

    >>> Question.objects.filter(Q(question_text__contains='you'))
    [<Question: what are you doing>, <Question: what is wrong with you>, <Question: who are you>]

# Q(...), Q(...)

    >>> Question.objects.filter(Q(question_text__contains='you'), Q(question_text__contains='what'))
    [<Question: what are you doing>, <Question: what is wrong with you>]

# Q(...) & Q(...)

    >>> Question.objects.filter(Q(question_text__contains='you') & Q(question_text__contains='what'))
    [<Question: what are you doing>, <Question: what is wrong with you>]

OR 查询
使用 | 联结两个 Q 对象即可实现 OR 查询:

# Q(...) | Q(...)

    >>> Question.objects.filter(Q(question_text__contains='you') | Q(question_text__contains='who'))
    [<Question: what are you doing>, <Question: what is wrong with you>, <Question: who are you>, <Question: who am i>]

NOT 查询
使用 ~Q(...) 客户实现 NOT 查询:

# ~Q(...)

    >>> Question.objects.filter(~Q(question_text__contains='you'))
    [<Question: who am i>]

与关键字参数共用
记得要把 Q 对象放前面:

# Q(...), key=value

    >>> Question.objects.filter(Q(question_text__contains='you'), question_text__contains='who')
    [<Question: who are you>]

OR, AND, NOT 多条件查询
这几个条件可以自由组合使用:

# (A OR B) AND C AND (NOT D)

    >>> Question.objects.filter((Q(question_text__contains='you') | Q(question_text__contains='who')) & Q(question_text__contains='what') & ~Q(question_text__contains='are'))
    [<Question: what is wrong with you>]

动态构建查询条件
比如你定义了一个包含一些 Q 对象的列表,如何使用这个列表构建 AND 或 OR 查询呢? 可以使用 operator 和 reduce:

    >>> lst = [Q(question_text__contains='you'), Q(question_text__contains='who')]

# OR

    >>> Question.objects.filter(reduce(operator.or_, lst))
    [<Question: what are you doing>, <Question: what is wrong with you>, <Question: who are you>, <Question: who am i>]

# AND

    >>> Question.objects.filter(reduce(operator.and_, lst))
    [<Question: who are you>]

这个列表也可能是根据用户的输入来构建的,比如简单的搜索功能(搜索一个文章的标题或内容或作者名称包含某个关键字):

    q = request.GET.get('q', '').strip()
    lst = []
    if q:
        for key in ['title__contains', 'content__contains',
                    'author__name__contains']:
            q_obj = Q(**{key: q})
            lst.append(q_obj)
    queryset = Entry.objects.filter(reduce(operator.or_, lst))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值