注释:m2m字段中是否存在给定值

时间:2019-12-03 19:22:06

标签: python django django-rest-framework django-queryset drf-queryset

我有一个查询来检索这样的对象:

{
    "id": 1,
    "tags": [1, 2, 3]
}

我想检查对象的tags字段中是否存在给定标签(例如1),并将annotate的检查结果作为对象的字段存在:

{
    "id": 1,
    "tagged": true
}

这就是我想出的

annotate(
    tagged=Exists(
        Articles.tag_set.through.objects.filter(
            article_id=OuterRef("pk"), tag_id=tag.id
        )
    )
)

由于关系tags已经由主查询加载,所以对我来说,拥有辅助查询似乎是多余的。

有没有更简单的方法来构造此查询?接近过滤器in查找语法的地方。

1 个答案:

答案 0 :(得分:0)

假设标签是一个ArrayField

    q = Article.objects.annotate(
        tagged=Exists(
            Article.objects.filter(id=OuterRef('id'), tags__contains=[1])
        )
    )