我正在尝试查找 Problem 对象,该对象的所有标签都包含在与其相关的 tags 中。
我有以下模型。
class Tag(models.Model):
name = models.CharField(verbose_name='Tag Name', max_length=50)
description = models.CharField(verbose_name='Description', max_length=100, null=True, blank=True)
class Problem(models.Model):
name = models.CharField(verbose_name='Problem Name', max_length=250)
contest_info = models.ManyToManyField(ContestInfo, verbose_name='Contest Info')
tags = models.ManyToManyField(Tag, verbose_name='Tags')
我关注了这些帖子:Post-1和 Post-2 .
但是,没有一个有效。
我的方法。
方法一
query = [Q(tags__id__in=[tag]) for tag in tags]
problems = problems.filter(reduce(__and__, query))
返回空查询集。
方法二
for tag in tags:
problems &= problems.filter(tags__id__in=[tag])
返回 OR 的结果而不是 AND。 使用 intersection() 也会得到相同的结果。
我想得到列表中包含所有标签的那些问题。如何做到这一点?
注意:problems 是一个查询集,tags 是 Tag 对象的 id 列表。
请您参考如下方法:
对于 postgresql,你可以这样做(已测试):
from django.contrib.postgres.aggregates import JSONBAgg
problems = Problem.objects.annotate(tags_ids=JSONBAgg('tags__id'))
problems = problems.filter(tags_ids__contains=tags, tags_ids__contained_by=tags)
*其中“标签是标签对象的 ID 列表。”
