Фильтр запросов Django __ в точном соответствии - PullRequest
0 голосов
/ 10 мая 2018

У меня есть модели, как показано ниже:

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

Я хочу отфильтровать объекты Разрешений, которые обладают навыками точного соответствия, присутствующими на курсах (навыки на курсах), поэтому я отфильтровал список курсов и рассматриваемых навыков, как показано ниже:

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, я сейчас в ловушке, очень благодарен за любые советы, большое спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

В соответствии с вашими моделями и представлениями, вам необходимо определить skill_courses, для которого нужно разрешение, например:

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])
0 голосов
/ 10 мая 2018

навыки должны быть списком значений, а не объектами набора запросов.Используйте values_list , чтобы получить список значений из интересующего вас объекта навыков.

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