我有一个带有Publication模型和Tag模型的Django应用程序。每个出版物都有一个或多个与之关联的标签。我想用一组两个标签查询数据库,并且只返回那些标签有两个标签的出版物。
我似乎无法找到这方面的语法,虽然我确信它随时可用 - 我想我没有使用正确的语言来搜索。我已经尝试过的是:
pubs_for_tags = Publication.objects.filter(tags__title__istartswith=q, tags__title__istartswith=q2)
但是这给了我一个错误“关键字参数重复”。我也尝试了一些变化,但到目前为止还没有任何工作。有人可以告诉我正确的语法吗?
答案 0 :(得分:7)
pubs_for_tags = Publication.objects.filter(tags__title__istartswith=q).filter( tags__title__istartswith=q2)
要么
pubs_for_tags = Publication.objects.filter(Q(tags__title__istartswith=q), Q( tags__title__istartswith=q2))
答案 1 :(得分:1)
试试这个
from django.db.models import Q
pubs_for_tags = Publication.objects.filter(Q(tags__title__istartswith=q) & Q( tags__title__istartswith=q2))
检查此link
答案 2 :(得分:1)
我知道这已经过时了,但是我遇到了同样的问题,并且意识到它指出了(就我所知)在一对多或多对多关系中使用Django过滤器的无证方面。在同一过滤器中生成的两个条件适用于相同的相关对象。在单独的过滤器中创建的两个条件可以匹配两个单独的相关对象。
另一种思考方式是每个完整过滤器一次只查看一个相关对象,如果所有相关对象都失败了该过滤器,则删除结果。鉴于此,在同一过滤器中使用相同关键字的情况非常罕见。
考虑以下问题:
pubs_for_tags = Publication.objects.filter(
tags__title__istartswith=q,
tags__title__iendswith=q2
)
VS
pubs_for_tags = Publication.objects.filter(
tags__title__istartswith=q,
).filter(
tags__title__iendswith=q2
)
第一个查询查找每个都有一个标记的出版物 both 以q开头并以q2结尾。当关键字相同时(注意我在我的示例中使用了两个不同的关键字),您还会重复"关键字参数"错误。
第二个查询查找每个都有一个以q开头的标记并且标记以q2结尾的出版物,但每个出版物可以是两个不同的标记。从你的帖子中,听起来这非常接近你需要的东西(只需改变" iendswith" to" istartswith")。唯一可能破坏的部分是q和q2是相同的还是一个是另一个的子串。在这种情况下,出版物可以有一个满足两种条件的标签。
请注意,所有这些意味着使用Q对象(nnmware和Gaurav作为可能的解决方案提供)将无法提供您想要的结果。在单个过滤器中使用两个Q对象会强制行为与第一个示例相同,但绕过"关键字参数重复"错误。
pubs_for_tags = Publication.objects.filter(
Q(tags__title__istartswith=q) & Q(tags__title__istartswith=q2)
)