Django reverse ForeignKey возвращает None
У меня есть модели Student и Mark в разных приложениях одного проекта.
# project/study
# models.py
class Mark(models.Model):
...
student = models.ForeignKey(
"students.Student",
on_delete=models.PROTECT,
related_name="marks",
related_query_name="mark",
)
# project/students
# models.py
class Student(models.Model):
...
# views.py
class StudentDetailView(DetailView):
queryset = Student.objects.prefetch_related("marks")
template_name = "students/one_student.html"
context_object_name = "student"
# one_student.html
...
<p>{{ student.marks }}</p>
...
Вывод html - "study.Mark.None" В этом и заключается моя проблема.
Я пробовал сделать поле ManyToOneRel на студенте, select_related, сделать custom view func, но это не помогает. Обратный ForeignKey приводит к None. Смотрел смежные вопросы - не могу понять ответы, потому что они не имеют прямого отношения к моей ситуации.
Я ожидаю получить все оценки студента.
Что я делаю не так?
The related_name='marks'
. Furthermore you here got the manager, not a queryset, use .all()
[Django-doc] to get the objects:
<p>{{ student.marks.all }}</p>
Возможно, вам также следует перечислить их, например:
{% for mark in student.marks.all %}
{{ mark.score }}
{% endfor %}
Мы можем использовать django model Prefetch следующим образом:
from django.db.models import Prefetch
queryset = Student.objects.prefetch_related(Prefetch("marks", queryset=Mark.objects.all(), to_attr="student_marks"))
В html-шаблоне необходимо выполнить итерацию по циклу следующим образом:
{% for mark in student.student_marks %}
<p>{{ mark }}</p>
{% endfor %}