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 - 查询列表中的任何项目在多对多字段中的任何对象