Как работать с промежуточной таблицей для связывания моделей ManyToManyField в Django?
Есть две модели Courses и Teachers. Они связаны отношением ManyToManyField. В ДБ есть промежуточная таблица courses_ct. Как во views.py отобразить всех учителей для каждого курса.
models.py
class Teachers(models.Model):
SUBJECTS = (
('Math','Math'),
('Infomatics', 'Informatics'),
('History', 'History'),
('Physics', 'Physics'),
)
teacher_name = models.CharField(max_length = 20)
teacher_subject = models.CharField(max_length = 10, null = True, choices = SUBJECTS)
teacher_info = models.TextField(null = True)
class Meta:
verbose_name = 'teacher'
verbose_name_plural = 'teachers'
def __str__(self):
return self.teacher_name
class Courses(models.Model):
SUBJECTS = (
('Math','Math'),
('Infomatics', 'Informatics'),
('History', 'History'),
('Physics', 'Physics'),
)
STATE = (
('A', 'Active'),
('N', 'Not active'),
)
course_title = models.CharField(max_length = 50)
course_description = models.CharField(max_length = 100)
course_active = models.BooleanField()
course_full_info = models.TextField()
course_start = models.DateField(null = True)
course_end = models.DateField(null = True)
course_subject = models.CharField(max_length = 10, null = True, choices = SUBJECTS)
ct = models.ManyToManyField(Teachers, null = True)
Ответы (1 шт):
Автор решения: floydya
→ Ссылка
Смотря для чего это нужно, если отрендерить в шаблоне, то это можно сделать прям там:
{% for course in courses %}
{% for teacher in course.ct.all %}
{{ teacher.teacher_name }}
{% endfor %}
{% endfor %}
Нужно не забыть передать курсы в контексте рендера: доп. контекст в Class-based View.
Если есть потребность в обработке данных прям во вьюхе:
teachers = dict()
for course in Courses.objects.all():
# имя как ключ:
teachers[course.course_title] = course.ct.all()
# либо ID как ключ словаря:
# teachers[course.pk] = course.ct.all()
# Краткий вариант записи:
# teachers = { course.course_title: course.ct.all() for course in Courses.objects.all() }