Обратный запрос в 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

Вернуться на верх