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

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

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

User.objects.filter(skills__contains=skills)

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

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

【问题讨论】:

    标签: django django-models django-orm django-filter


    【解决方案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中。
    猜你喜欢
    • 1970-01-01
    • 2021-09-29
    • 2013-04-27
    • 2012-02-11
    • 2012-05-14
    • 2011-02-05
    • 2021-11-20
    • 2016-02-23
    相关资源
    最近更新 更多