以上截图出自张虎老师的《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