zoukankan      html  css  js  c++  java
  • Django ORM跨关联关系多值查询,filter链式调用

    1. 跨关联关系多值查询

    在这里插入图片描述
    以上截图出自张虎老师的《Python Django开发实战》一书。

    注意事项:以博客topic和评论comment为例

    Topic.objects.filter(comment__content__contains='very', comment__up__lte=60)
    # 返回的对象是什么呢?
    # 应该是QuerySet,这是由filter函数决定的
    # QuerySet中包含的是Topic对象(可能有多个满足条件的对象),(这些)Topic对象关联的Comment对象是同时满足这两个条件的
    

    如果只使用一个filter函数,来接收多个查询条件,如果有一个Comment对象同时满足这两个条件,则将该Comment对象关联的Topic对象添加到返回的QuerySet中

    Topic.objects.filter(comment__content__contains='very').filter(comment__up__lte=60)
    # 每一个filter函数返回的都是QuerySet对象,其中包含的才是Topic对象(可能有多个满足条件的对象)
    # 先查询第一个过滤器,返回满足评论内容包含 very 的所有Topic对象,包装在一个QuerySet对象中的
    # 再在这个QuerySet对象上,查询满足第二个过滤器条件的Topic对象
    
    # 这里先查询第一个过滤器,如果有Comment对象满足评论内容包含 very ,则返回其关联的Topic对象(可能有多个),以第一个过滤器返回的那些Topic为基础,再查询第二个条件,如果有点赞小于等于60的Comment对象,将其关联的Topic对象添加到返回的QuerySet中
    

    如果使用多个filter函数,单个函数接收单个条件,采用链式调用的方式来查询,则先过滤第一个查询条件,其返回的是QuerySet对象,注意:由于是跨关联关系查询,我们时刻要清除自己检索的是什么,这里我们检索的是Topic对象,而不是Comment对象,所以第一个过滤器返回的QuerySet内包含的也是Topic对象,而不是Comment对象。然后在此QuerySet基础上继续跨关联关系查询第二个过滤条件,如果返回的Topic对象关联的Comment对象中有满足过滤器条件的Comment,则将该Topic对象添加到返回的Queryset中

    正如书中所说,跨关联关系查询有些复杂,表现得比较奇怪,在实际中要谨慎使用。

  • 相关阅读:
    python第二十四课——set中的函数
    python第二十三课——dict中的函数
    python第二十二课——list函数
    10 编译PHP并与nginx整合
    09 nginx Rewrite(重写)详细解析
    07 nginx Location之正则匹配
    06 nginx Location详解之精准匹配
    JQ 修改样式
    05 nginx定时任务完成日志切割
    linux 时间与本地时间不对应解决办法
  • 原文地址:https://www.cnblogs.com/leerep/p/14645330.html
Copyright © 2011-2022 走看看