Обратный запрос в Django Many to Many
У меня возникла проблема в django reverse many to many. В принципе, я думаю, что я упускаю что-то, что я еще не смог понять правильно. У меня есть такие модели и представления.
models.py
class TheorySyllabus(models.Model):
name = models.CharField(max_length=100, null=True, blank=True)
subject_duration = models.ManyToManyField(
SubjectDuration, related_name='subject_durations')
course_type = models.ForeignKey(
CourseType, on_delete=models.DO_NOTHING, null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = 'Theory Syllabus'
class TheoryCourse(models.Model):
name = models.CharField(max_length=100)
student = models.ManyToManyField(Student, related_name='theory_courses')
theory_syllabus = models.ForeignKey(
TheorySyllabus, on_delete=models.DO_NOTHING, null=True, blank=True)
is_active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class Student(models.Model):
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
date_of_birth = models.DateField()
fiscal_code = models.CharField(max_length=50)
phone = models.CharField(max_length=50)
license = models.ForeignKey(
License, on_delete=models.PROTECT, blank=True, null=True)
picture = models.ImageField(
blank=True, null=True, default='default.png')
id_card = models.ForeignKey(
IDCard, on_delete=models.PROTECT, blank=True, null=True)
address = models.CharField(max_length=100)
cap = models.CharField(max_length=10)
city = models.CharField(max_length=100)
province = models.CharField(max_length=100)
country = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
is_active = models.BooleanField(default=True)
def __str__(self):
return self.user.first_name + ' ' + self.user.last_name
views.py
class CourseListView(ListView):
model = TheoryCourse
queryset = TheoryCourse.objects.filter(
is_active=True).order_by('-created_at')
template_name = 'theory/course_list.html'
context_object_name = 'theory_courses'
paginate_by = 10
шаблон
<div class="card-body table-responsive p-0">
<table class="table table-hover text-nowrap table-bordered">
<thead>
<tr>
<th>Course Type</th>
<th>Course Name</th>
</tr>
</thead>
<tbody>
{% for course in theory_courses %}
<tr>
<td>{{course.theory_syllabus.name}}</td>
<td>{{course.name}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
Что мне нужно сделать, так это получить общее количество студентов, которые находятся в каждой модели TheoryCourse. Но я понятия не имею, как использовать обратное отношение. Я пытался использовать это в шаблоне с чем-то вроде:
{% for student in theory_courses.students.all %}
{% endfor %}
Но это не работает. Я прочитал всю документацию по django, но либо я чего-то не понял, либо делаю что-то не так. Любая помощь будет оценена по достоинству
Итак, у вас в модели student, а не students. Таким образом, для будет выглядеть примерно так
{% for student in theory_courses.student.all %}
{% endfor%}
Кроме того, если вы хотите получить только счетчик, вы можете просто использовать
{% for student_count in theory_courses.student.count %}
{% endfor %}
P.S. Это не имеет ничего общего с обратным (related_name) способом "многие ко многим". related name просто означает, что вы можете получить доступ к вашей модели TheoryCourse из Student с помощью Student.theory_courses