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对象查询的后面
  • 相关阅读:
    win10 UWP button
    内网分享资源
    内网分享资源
    CF724F Uniformly Branched Trees
    win10 UWP FlipView
    win10 UWP FlipView
    win10 UWP FlipView
    搭建阿里云 centos mysql tomcat jdk
    搭建阿里云 centos mysql tomcat jdk
    win10 UWP 申请微软开发者
  • 原文地址:https://www.cnblogs.com/hooo-1102/p/12078344.html
Copyright © 2011-2022 走看看