Как я могу сделать запрос через отношения «многие ко многим»

avatar
Kevin Herrmann
8 августа 2021 в 17:46
34
0
0

Я хочу отобразить тренера на дату курса. У курса может быть несколько дат, и в каждую дату можно использовать разных тренеров. У тренера может быть разная роль в каждую дату курса. (Инструктор, помощник...)

Как сделать правильный запрос? Подходят ли модели для этого?

Модели:

class Course_dates(models.Model):
    date = models.DateField()
    start = models.TimeField()
    end = models.TimeField()

    def __str__(self):
        return str(self.id)
        """return self.date.strftime("%d.%m.%Y")"""

class Course(models.Model):
    course_number = models.CharField(max_length=24, blank=True)
    course_location = models.ForeignKey(Course_location, on_delete=models.CASCADE)
    course_dates = models.ManyToManyField('Course_dates', through="Course_Course_dates")

    def __str__(self):
        return self.course_number

class Trainer_Course_Course_date_role(models.Model):
    trainer = models.ForeignKey(Trainer, on_delete=models.CASCADE)
    role = models.CharField(max_length=24, blank=True)

    def __str__(self):
        return str(self.id)

class Course_Course_dates(models.Model):
    course = models.ForeignKey(Course, on_delete=models.CASCADE)
    course_dates = models.ForeignKey(Course_dates, on_delete=models.CASCADE)
    trainer = models.ForeignKey(Trainer_Course_Course_date_role, on_delete=models.CASCADE, null=True)


    def __str__(self):
        return str(self.id)

class Trainer(models.Model):
    salutation = models.CharField(max_length=8,choices=GENDER_CHOICES)
    last_names = models.CharField(max_length=56)
    first_names = models.CharField(max_length=56)
    date_of_birth = models.DateField()
    address = models.ForeignKey(Address, on_delete=models.CASCADE)
    email = models.EmailField()
    phone = models.CharField(max_length=56, blank=True)
    mobile = models.CharField(max_length=56, blank=True)

    def __str__(self):
        return self.last_names

Просмотр:

def course(request):
    courses = Course.objects.all()
    course_list = []

    for course in courses:
        sorted_date_list = course.course_dates.all().order_by('date')

        course_list.append({'course': course, 'sorted_date_list': sorted_date_list })
    
    context = { 'course_list': course_list, }
    return render(request, 'kursverwaltung_tenant/course.html', context)
Источник
Brian Destura
9 августа 2021 в 00:56
0

course_dates — это поле m2m модели Course и внешний ключ Course_Course_dates. Какой использовать?

Kevin Herrmann
9 августа 2021 в 08:03
0

Да, курс (курс) может иметь несколько дат курса (Course_dates). Course_Course_dates является связующим звеном между этим и тренером.

Brian Destura
9 августа 2021 в 08:24
0

Ах, ты прав, я не заметил through

Brian Destura
9 августа 2021 в 08:25
0

Попробуйте так: Trainer.objects.filter(course_course_dates_set__course_dates__in=Course_dates.objects.filter(date='...', start='...', end='...',))

Brian Destura
9 августа 2021 в 08:26
0

Это позволит получить всех инструкторов, которые удовлетворяют указанным датам курса, используя сквозную модель.

Kevin Herrmann
10 августа 2021 в 07:42
0

Благодарю вас! Но именно так я получаю всех тренеров на один курс. Но если несколько курсов проходят одновременно, это не работает. Или? Поэтому мне нужно подключение к курсу с индивидуальным номером курса.

Brian Destura
10 августа 2021 в 07:44
0

Нет, все равно получат всех тренеров на всех курсах, соответствующих этим датам. Если вам нужно несколько дат, вы можете настроить запрос на Course_dates

Ответы (0)