zoukankan      html  css  js  c++  java
  • Django first()和last() F查询以及Q查询

    一、first()和last()

    分别返回queryset的第一项与最后一项,具体用法如下:

    p = Blog.objects.order_by('title').first()

    等同于:  

    try:
        p = Blog.objects.order_by('title')[0]
    except IndexError:
        p = None 

    举个栗子:

     现在博客表中只有一篇博客,该博客id为13:

    然后在shell命令行中,找id大于13的第一篇博客,我们知道是没有的,使用first()时得到一个None对象,如果使用[0]会触发IndexError

    所以first()和last()很适合博客里的上一篇下一篇这种场景。如果是最后一篇博客找下一篇博客时,或者第一篇博客找上一篇博客时不会报错,返回一个None对象,如果是中间的博客,id为13的博客的下一篇是id大于13的第一篇博客,也就是id为14的博客,如果id为14的博客被删了,就是id为15的博客,一直往后找,如果一直没有,则返回一个None对象,不管怎么样,不会触发IndexError。

        # 取出ID大于当前博客ID的数据的第一个 -> 当前文章的下一篇
        next_topic = Topic.objects.filter(id__gt=author_topic.id, author=author).first()
        # 取出ID小于当前博客ID的数据的最后一个 -> 当前文章的上一篇
        last_topic = Topic.objects.filter(id__lt=author_topic.id, author=author).last()

    二、F查询以及Q查询

      当一般的查询语句已经无法满足我们的需求时,Django为我们提供了F和Q复杂查询语句。假设场景一:老板说对数据库中所有的商品,在原价格的基础上涨价10元,你该怎么做?场景二:我要查询一个名字叫xxx,年龄是18岁,或者名字是yyy,年龄是是19岁的人,你该怎么写你的ORM语句

      1.F查询

    from django.db.models import F
    from app01.models import Book
     
    Book.objects.update(price=F("price")+20)  # 对于book表中每本书的价格都在原价格的基础上增加20元

      就这样一条简单的语句就完成了对表中所有商品价格的更新,是不是很方便!如果没有F查询,你首先要获取原价格,再做一个算术运算,然后更新字段。F查询专门对对象中某列值的操作,不可使用__双下划线!

      

      2.Q查询

      Q查询可以组合使用 “&”, “|” 操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象,Q对象可以用 “~” 操作符放在前面表示否定,也可允许否定与不否定形式的组合。Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。

    from django.db.models import Q
     
    print(Book.objects.filter(Q(id=3))[0])  # 因为获取的结果是一个QuerySet,所以使用下标的方式获取结果
    print(Book.objects.filter(Q(id=3)|Q(title="Go"))[0])  # 查询id=3或者标题是“Go”的书
    print(Book.objects.filter(Q(price__gte=70)&Q(title__startswith="J")))  # 查询价格大于等于70并且标题是“J”开头的书
    print(Book.objects.filter(Q(title__startswith="J") & ~Q(id=3)))  # 查询标题是“J”开头并且id不是3的书
    print(Book.objects.filter(Q(price=70)|Q(title="Python"), publication_date="2017-09-26"))  # Q对象可以与关键字参数查询一起使用,必须把普通关键字查询放到Q对象查询的后面
  • 相关阅读:
    斐波那契数列递归算法和非递归算法以及其时间复杂度分析
    Python为什么不需要swap(a, b)
    学习MySQL中遇到的问题(net start mysql; 服务名无效。 请键入 NET HELPMSG 2185 以获得更多的帮助)
    python 3以上版本使用pickle.load读取文件报UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 6
    Mysql 服务无法启动 服务没有报告任何错误
    Keras和tensorflow的区别
    简单易懂的softmax交叉熵损失函数求导
    Ajax 请求
    Ajax 新建对象
    jquery Ajax noConflict()
  • 原文地址:https://www.cnblogs.com/hooo-1102/p/12078344.html
Copyright © 2011-2022 走看看