首页 > 其他 > 详细

Django ORM跨关联关系多值查询,filter链式调用

时间:2021-04-11 22:00:45      阅读:55      评论:0      收藏:0      [点我收藏+]

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中

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

Django ORM跨关联关系多值查询,filter链式调用

原文:https://www.cnblogs.com/leerep/p/14645330.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!