【问题标题】:Django filter queryset __in exact matchingDjango过滤查询集__in完全匹配
【发布时间】:2018-10-20 12:41:42
【问题描述】:

我的模型如下:

class Skill(models.Model):
    name = models.CharField(max_length=100, default="")

class Permit(models.Model):
    name = models.CharField(max_length=50)
    skill_course = models.ManyToManyField(
        Skill, related_name="+", blank=True,
    )

class Course(models.Model):
    name = models.CharField(max_length=50)
    skills = models.ManyToManyField(
        Skill, related_name="courses",blank=True,
    )

我想过滤具有完全匹配技能的 Permit 对象出现在课程中(技能在课程中),所以我过滤了列表课程和技能,如下所示:

course = Course.objects.filter(students=self.request.user, date__lt=datetime.datetime.today())
skills = list(Skill.objects.filter(courses__in=course).distinct())
queryset = Permit.objects.filter(skill_course__in=skills)

但这是模糊匹配,不是精确匹配。例如:

# only if list permit_a = user.skill_a, current user will get permit_a
permit_a = [A, B, C, D]
user.skill_a = [A, B, C, D]

但是现在user.skill_a = [B, E, F],当前用户已经得到permit_a,我现在被困住了,非常感谢任何建议,提前非常感谢。

【问题讨论】:

  • stackoverflow.com/questions/8618068 查看这个 SO 问题,他们提出了一种聚合方法,您可以执行类似 queryset = Permit.objects.filter(skill_course__in=skills).annotate(num_skills=Count('skills')).filter(num_skills=skills.count()) 的操作
  • 谢谢 Bhavani,我已经看过那篇文章了,我猜它不一样?因为我总是得到错误的结果,我需要先定义技能课程吗?我把我的代码改成了你的,没有任何改变......

标签: django listview filter django-queryset exact-match


【解决方案1】:

技能需要是值列表而不是查询集对象。使用 values_list 从您感兴趣的技能对象中获取值列表。

skills = Skill.objects.filter(courses__in=course).values_list('FIELD_OF_INTEREST', flat=True)

【讨论】:

  • 您好 Vinay,感谢您的回答,现在我有一个新问题,如何定义 Skill_course 的许可需求?不要用'pk=1'分配一个项目,我必须像pk=pk这样定义,因为有数百个许可证,有些许可证有一个skill_course,有些许可证有几个skill_courses,我需要精确匹配所有,而不仅仅是一个允许为 pk=1.....
【解决方案2】:

根据您的模型和视图,您需要定义许可所需的技能课程,如下所示:

permit = get_object_or_404(Permit, pk=1)
skill_courses = permit.skill_course.all()

然后您需要将技能更改为“精确匹配”,如下所示:

queryset = Permit.objects.filter(skill_course__in=[skill for skill in skill_courses if skill in skills])

【讨论】:

  • 非常感谢,终于成功了!!!!!!现在我有一个新问题,如何定义许可证需要的技能课程?不给pk=1分配一个,但是我必须定义pk=pk,有几百个permit,有的permit有一个skill_course,有的permit有几个skill_courses,我需要精确匹配所有,而不是只有一个permit as pk= 1…………
猜你喜欢
  • 2015-12-30
  • 2021-10-20
  • 1970-01-01
  • 2012-07-09
  • 2020-07-19
  • 2020-09-14
  • 1970-01-01
  • 2017-11-07
  • 2014-11-01
相关资源
最近更新 更多