代码之家  ›  专栏  ›  技术社区  ›  MistyD Harish Kumar Kailas

基于ManyToManyField的筛选-如果列表中存在项,则获取记录

  •  0
  • MistyD Harish Kumar Kailas  · 技术社区  · 7 年前

    我想知道是否有一种方法可以让我根据ManyToManyField字段进行过滤。我知道有一个 __in 过滤器然而,这个过滤器似乎需要一个id,而我没有id(我可以得到id,但我想知道没有它是否可能)。 这就是我的模型的样子

    class modelEmployee(models.Model):
        user                = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
        title               = models.CharField(max_length=200, unique=False, blank=False, null=True)
        skills              = models.ManyToManyField(modelSkill, blank=True)
    
    class modelJob(models.Model):
        skills              = models.ManyToManyField(modelSkill,blank=True)
        title               = models.CharField(max_length=200, unique=False,blank=False,null=True)
    

    这是多对多的模型

    class modelSkill(models.Model):
        skill_description   = models.CharField(max_length=50, unique=True)
    

    现在我有了一个如下的列表

      skillList = [SkillA,SkillB,SkillC...] #Description field
    

    目前我不可能做到这一点

    modelJob.objects.filter(skills__in=skillList)
    

    我不能做上述操作的原因是因为skills_uuin需要一个包含技能id号的列表,而不是其他技能领域的列表。我的问题是,我如何告诉skills____;我所传递的列表是 skill_description 的 modelSkill 而不是身份证?

    更新: 如果我这样做

      queryset_list = modelEmployee.objects.filter(skills___skill_description__in=skill_filter)
    

    我得到了错误

    raise FieldError('Related Field got invalid lookup: {}'.format(lookups[0]))
    django.core.exceptions.FieldError: Related Field got invalid lookup: _skill_description
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Community Mohan Dere    6 年前

    你可以挖深一层,然后匹配 skill_description 具体而言:

    modelJob.objects.filter(skills__skill_description__in=skillList)
    

    从Django文档:

    例如,如果一个条目有一个名为tags的多个字段,我们可能希望找到链接到名为“music”和“bands”的标签的条目,或者我们可能希望一个条目包含一个名为“music”且状态为“public”的标签。

    为了处理这两种情况,Django有一种处理filter()调用的一致方法。单个filter()调用中的所有内容都将同时应用,以筛选出符合所有这些要求的项。连续的filter()调用进一步限制了对象集,但对于多值关系,它们适用于链接到主模型的任何对象,而不一定是先前filter()调用选择的对象。

    这听起来可能有点让人困惑,所以希望通过一个例子来说明这一点。要选择所有包含标题中同时包含列侬和2008年发布的条目的博客(同一条目同时满足这两个条件),我们将写:

    Blog.objects.filter(entry__headline__contains='Lennon', entry__pub_date__year=2008)
    

    https://docs.djangoproject.com/en/2.1/topics/db/queries/#spanning-multi-valued-relationships