django - Django filter queryset __in exact matching
问题描述
I have models as below:
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,
)
I want to filter Permit objects which have exact matching skills present in courses(skills are in courses), so I filtered list course and skills in view as below:
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)
But this is fuzzy matching, not exact matching. For example:
# 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]
but now user.skill_a = [B, E, F]
, current user already got permit_a
, I am trapped now, really appreciate for any advise, thanks so much in advance.
解决方案
According to your models and views, you need to define skill_courses the permit needs, like this:
permit = get_object_or_404(Permit, pk=1)
skill_courses = permit.skill_course.all()
And then you need to change skills into 'exact matching' as below:
queryset = Permit.objects.filter(skill_course__in=[skill for skill in skill_courses if skill in skills])
推荐阅读
- alert - “无数据”时的 Grafana 警报
- java - 字符串方法通过带计数的参数来整数
- mongodb - 为什么 $gte 和 $lte 不能使用像“2020/12/09”这样的特定日期来获取像 ISODate("2020-12-09T04:32:37.266Z") 这样的文档
- android - Android BLE 扫描在后台运行几分钟后停止
- javascript - 在类中使用 fetch 函数?
- apache-spark - Spark SQL Datediff 列之间的分钟数
- google-workflows - 使用 nodejs 管理工作流
- docker - 如何生成密钥并在 docker-compose 中的两个容器之间共享?可能吗?
- python - 使用 keras 密集模型的矩阵逆逼近
- r - 具有两组的ggplot图,每组显示各自的误差线