Django 包含多对多字段

Posted

技术标签:

【中文标题】Django 包含多对多字段【英文标题】:Django contains on a many to many field 【发布时间】:2020-03-16 08:02:00 【问题描述】:

我正在努力让用户具备轮班所需的技能。这意味着用户需要具备确切的技能或更多技能。

我试过这个。但这不适用于关系字段

User.objects.filter(skills__contains=skills)

in 运算符也不起作用,因为我需要一个具有所有技能的用户,而不是一个具有所需技能子集的用户。

如果询问的技能是用户技能的子集,有没有办法检索用户?

【问题讨论】:

【参考方案1】:

您可以使用__in lookup [Django-doc],然后计算匹配数是否与skills 中的元素数相同。我们在这里假设 skills 包含 unique 元素(所以没有重复)。您可以先将技能列表转换为set 以排除重复项。

因此我们可以过滤:

from django.db.models import Count

User.objects.filter(
    skills__in=skills
).annotate(
    matching_skills=Count('skills')
).filter(
    matching_skills=len(skills)
)

【讨论】:

很好的解决方案!如果用户的技能多于所需技能,我添加了 __gte! @JessieLiauwAFong:但由于过滤,将返回的最大值是skills 中的项目数。但是__gte当然不会造成伤害,因为__exact隐含在__gte中。

以上是关于Django 包含多对多字段的主要内容,如果未能解决你的问题,请参考以下文章

Django - 查询列表中的任何项目在多对多字段中的任何对象

Django admin,多对多字段,多个重复条目

django - 如何查询仅描述的对象存在于多对多字段中的位置

Django 多对多字段

Django如何过滤多对多字段中的对象,而不是原始查询集

如何以 django 形式过滤多对多字段