• 【1025 | Day53】ORM之F查询和Q查询


    ORM之F查询和Q查询

    1. F查询和Q查询

    1. 当需要字段和字段作比较的时候用F查询

    2. 当查询条件是or的时候用Q查询

    • 因为默认的filter参数都是and的关系

    1.1 F查询

    在之前的所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。

    如果我们要对两个字段的值做比较,那该怎么做呢?

    第一:Django 提供 F() 来做这样的比较。

    第二:F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。

    1.1.1 示例

    查询评论数大于收藏数的书籍

    from django.db.models import F
    models.Book.objects.filter(commnet_num__gt=F('keep_num'))
    

    Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。

    models.Book.objects.filter(commnet_num__lt=F('keep_num')*2)
    

    修改操作也可以使用F函数,比如将每一本书的价格提高30元

    models.Book.objects.all().update(price=F("price")+30)
    

    1.1.2 引申

    如果要修改char字段咋办????

    如:把所有书名后面加上(第一版)

    >>> from django.db.models.functions import Concat
    >>> from django.db.models import Value
    
    
    >>> models.Book.objects.update(title=Concat(F("title"), Value("("), Value("第一版"), Value(")")))
    
    # SQL分析:
    
    models.Book.objects.all().update(title)   #  更新title字段
    title=Concat(F("title"), Value("("), Value("第一版"), Value(")")) 
    
    # 1.Concat把字符串F('title') 和 Value(表示转换成值)'第一版' 拼接起来
    

    1.2 Q查询

    filter()等方法中的关键字参数查询都是一起进行“AND” 的。 如果你需要执行更复杂的查询(例如"OR"语句),你可以使用Q对象

    1.2.1 示例

    查询作者名是Max或Caroline

    models.Book.objects.filter(Q(authors__name="Max")|Q(authors__name="Caroline"))
    

    你可以组合&| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。

    同时,Q 对象可以使用" ~ "操作符取反,这允许组合正常的查询和取反(NOT/非) 查询。

    示例:查询作者名字是村上春树并且不是2018年出版的书的书名

    >>> models.Book.objects.filter(Q(author__name="村上春树") & ~ Q(publish_date__year=2018)).values_list("title")
    
    >>>  <QuerySet [('没有男人的女人们',)]>
    

    查询函数可以混合使用Q 对象关键字参数

    所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。

    但是,如果出现Q 对象,它必须位于所有关键字参数的前面。

    例如:查询出版年份是2017或2018,书名中带物语的所有书。

    >>> models.Book.objects.filter(Q(publish_date__year=2018) | Q(publish_date__year=2017), title__icontains="物语")
    
    <QuerySet [<Book: 番茄物语>, <Book: 香蕉物语>, <Book: 橘子物语>]>
    

    1.2.2 Q查询输入字符串

    Book.objects.filter(Q(title="linux") | Q(price=123))
    

    上面的方式查询条件只能是字段名。

    如果我们只有字符串怎么写呢?

    “title” 、 “price”

    q = Q()                                # 实例化一个Q对象
    q.connector = "or"                     # 默认是且的关系
    q.children.append("title", "linux")    
    q.children.append("price", 123)
    Book.objects.filter(q)                 # 这个效果和上面的一样,只是条件可以是字符串了
    
  • 相关阅读:
    dubbo zookeeper报错failed to connect to server , error message is:No route to host
    linux的ssh命令
    linux的/etc/hosts的作用
    linux如何查看某个pid的进程?
    Nginx配置详解
    nginx基本配置与参数说明以及Nginx中的upstream轮询机制介绍
    Nginx配置upstream实现负载均衡
    nginx简单的nginx.conf配置
    API Gateway性能比较:NGINX vs. ZUUL vs.Cloud Gateway vs. Linkerd[译]
    RabbitMQ 入门【精+转】
  • 原文地址:https://www.cnblogs.com/fxyadela/p/11737336.html
Copyright © 2020-2023  润新知