一尘不染

Django中具有多个参数的过滤器和链式过滤器之间的区别

django

Django中具有多个参数的过滤器和链式过滤器之间的区别


阅读 621

收藏
2020-03-31

共1个答案

一尘不染

正如你在生成的SQL语句中看到的那样,差异不是某些人可能怀疑的“或”。这是WHERE和JOIN放置的方式。

Example1(相同的联接表):来自https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships

Blog.objects.filter(
       entry__headline__contains='Lennon', 
       entry__pub_date__year=2018)

这将为你提供所有两个条目都具有一个条目的Blog (entry__headline__contains='Lennon') AND (entry__pub_date__year=2018),这是你从该查询中获得的期望。

结果:

Blog with {entry.headline: 'Life of Lennon', entry.pub_date: '2018'}

示例2(链接)

Blog.objects.filter(
       entry__headline__contains='Lennon'
           ).filter(
       entry__pub_date__year=2018)

这将涵盖示例1的所有结果,但将产生更多结果。因为它首先使用(entry__headline__contains='Lennon')结果过滤器过滤所有博客,然后使用结果过滤器过滤所有博客(entry__pub_date__year=2018)

不同之处在于它还会为你提供以下结果:

具有多个条目的单个Blog

{entry.headline: '**Lennon**', entry.pub_date: 2000}, 
{entry.headline: 'Bill', entry.pub_date: **2018**}

评估第一个过滤器时,由于包含第一个条目,因此将其包括在内(即使该条目的其他条目不匹配也是如此)。当评估第二个过滤器时,由于有第二个条目,因此将本书包括在内。

一个表:但是,如果查询不涉及联接表,例如Yuji和DTing中的示例。结果是一样的。

2020-03-31