3

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

尽管我确信它很容易获得,但我似乎无法找到它的语法 - 我想我没有使用正确的语言进行搜索。我已经尝试过的是:

pubs_for_tags = Publication.objects.filter(tags__title__istartswith=q, tags__title__istartswith=q2)

但这给了我一个错误“关键字参数重复”。我也尝试了一些变体,但到目前为止没有任何效果。有人可以告诉我正确的语法吗?

4

3 回答 3

10
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))
于 2013-05-31T16:22:21.380 回答
2

我知道这很老,但我刚刚遇到了同样的问题,并意识到它指向(据我所知)在一对多或多对多关系中使用 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)
    )
于 2016-04-14T19:22:58.580 回答
0

试试这个

from django.db.models import Q
pubs_for_tags = Publication.objects.filter(Q(tags__title__istartswith=q) & Q( tags__title__istartswith=q2))

检查这个链接

于 2014-07-24T13:36:12.400 回答