我知道这很老,但我刚刚遇到了同样的问题,并意识到它指向(据我所知)在一对多或多对多关系中使用 Django 过滤器的一个未记录的方面。同一过滤器中的两个条件适用于同一相关对象。在单独的过滤器中生成的两个条件可以匹配两个单独的相关对象。
另一种思考方式是,每个完整的过滤器一次只查看一个相关对象,如果其所有相关对象都未能通过该过滤器,则删除结果。鉴于此,您极少希望在同一个过滤器中使用相同的关键字出现两个条件。
考虑以下查询:
pubs_for_tags = Publication.objects.filter(
tags__title__istartswith=q,
tags__title__iendswith=q2
)
对比
pubs_for_tags = Publication.objects.filter(
tags__title__istartswith=q,
).filter(
tags__title__iendswith=q2
)
第一个查询查找每个出版物都有一个标签,该标签既以 q 开头,又以 q2 结尾。当关键字相同时(注意我在示例中使用了两个不同的关键字),您还会收到“关键字参数重复”错误。
第二个查询查找每个出版物都有一个以 q 开头的标签和一个以 q2 结尾的标签,但每个出版物可以是两个不同的标签。从您的帖子来看,这听起来非常接近您的需要(只需将“iendswith”更改为“istartswith”)。唯一可能中断的部分是 q 和 q2 是否相同或者一个是另一个的子串。在这种情况下,出版物可能有一个标签,可以同时满足这两个条件。
请注意,所有这一切都意味着使用 Q 对象(nnmware 和 Gaurav 提供的可能的解决方案)不会给您想要的结果。在单个过滤器中包含两个 Q 对象会强制执行与第一个示例相同的行为,但可以避免“关键字参数重复”错误。
pubs_for_tags = Publication.objects.filter(
Q(tags__title__istartswith=q) & Q(tags__title__istartswith=q2)
)