和条件Django查询使用相同的关键字

jac*_*300 1 sql django django-filter

我有一个带有Publication模型和Tag模型的Django应用程序.每个出版物都有一个或多个与之关联的标签.我想用一组两个标签查询数据库,并且只返回那些标签有两个标签的出版物.

我似乎无法找到这个的语法,虽然我确信它是随时可用的 - 我想我没有使用正确的语言来搜索.我已经尝试过的是:

pubs_for_tags = Publication.objects.filter(tags__title__istartswith=q, tags__title__istartswith=q2)
Run Code Online (Sandbox Code Playgroud)

但这给了我一个错误"关键字参数重复".我也尝试了一些变化,但到目前为止还没有任何工作.有人可以告诉我正确的语法吗?

小智 7

pubs_for_tags = Publication.objects.filter(tags__title__istartswith=q).filter( tags__title__istartswith=q2)
Run Code Online (Sandbox Code Playgroud)


要么

pubs_for_tags = Publication.objects.filter(Q(tags__title__istartswith=q), Q( tags__title__istartswith=q2))
Run Code Online (Sandbox Code Playgroud)


Jon*_*rds 5

我知道这已经很旧了,但我刚刚遇到了同样的问题,并意识到它指向(据我所知)跨一对多或多对多关系使用 Django 过滤器的未记录的方面。在同一过滤器中创建的两个条件适用于同一相关对象。在单独的过滤器中创建的两个条件可以匹配两个单独的相关对象。

另一种思考方式是,每个完整的过滤器一次仅查看一个相关对象,如果所有相关对象都未通过该过滤器,则删除结果。鉴于此,您极少会希望在同一过滤器中使用相同关键字的两个条件。

考虑以下查询:

pubs_for_tags = Publication.objects.filter(
    tags__title__istartswith=q,
    tags__title__iendswith=q2
    )
Run Code Online (Sandbox Code Playgroud)

pubs_for_tags = Publication.objects.filter(
    tags__title__istartswith=q,
    ).filter(
    tags__title__iendswith=q2
    )
Run Code Online (Sandbox Code Playgroud)

第一个查询查找每个出版物都有一个以 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)
    )
Run Code Online (Sandbox Code Playgroud)