首页 > 解决方案 > 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.

标签: djangolistviewfilterdjango-querysetexact-match

解决方案


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])

推荐阅读