Django中具有多个参数的过滤器和链式过滤器之间的区别
正如你在生成的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),这是你从该查询中获得的期望。
(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)。
(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中的示例。结果是一样的。