Skip to main content
 首页 » 编程设计

python之Django:M2M 字段查询使用列表中的每个值 'in'

2025年01月19日36pengyingh

我正在尝试查找 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 列表。”