У меня есть модели 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, создать функцию пользовательского представления, но это не помогло. Обратный ForeignKey не дает ничего. Смотрел похожие вопросы - не могу понять ответов, так как они не имеют прямого отношения к моей ситуации.
Я ожидаю получить все оценки студента.
Что я делаю не так?
related_name='marks'
. Кроме того, у вас есть менеджер, а не набор запросов, используйте .all() [Django-doc] для получения объектов:
<p>{{ student.marks.all }}</p>
Вероятно, вам также следует перечислить его, например:
{% for mark in student.marks.all %}
{{ mark.score }}
{% endfor %}
Мы можем использовать Prefetch модели django следующим образом:
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 %}
есть какие-нибудь подсказки, как ограничить запросы предварительной выборки с помощью Prefetch? Если я хочу получить 3 оценки последнего ученика (например)
Выяснилось (вы можете просто взять кусочек набора запросов)
В набор запросов мы можем добавить order_by(), если у вас есть created_at
или другое поле в модели.
Мой мозг просто взорвался от этой мысли. Я пробовал, например, mark_all, mark_set и т. д. Спасибо m8