Как отобразить связанные экземпляры один ко многим в ListView?
Я хочу отобразить все принадлежащие экземпляры модели Report
, ссылающейся на модель Module
, ссылающуюся на модель Course
. Поэтому я реализовал три модели, связанные через Foreignkey.
class Course(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
title = models.CharField(max_length=200, blank=True, null=True)
class Module(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
title = models.CharField(max_length=200, blank=True, null=True)
course_id = models.ForeignKey(
Course,
null=True,
on_delete=models.SET_NULL,
related_name="modules",
default=uuid.uuid4,
)
class Report(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
title = models.CharField(max_length=200, blank=True, null=True)
module_id = models.ForeignKey(
Module,
null=True,
on_delete=models.SET_NULL,
related_name="reports",
default=uuid.uuid4,
)
Я хочу отобразить модель Module
со ссылкой на модель Course
в CourseDetailView(DetailView):
Вот что я реализовал:
class CourseDetailView(DetailView):
model = Course
context_object_name = "course"
template_name = "course/course_detail.html"
fields = ["title", "description"]
def get_context_data(self, **kwargs):
context = super(CourseDetailView, self).get_context_data(**kwargs)
context["courses"] = Course.objects.filter(pk=self.kwargs.get("pk"))
return context
и я получаю экземпляр, принадлежащий самому себе.
Если я изменю context
на:
context["modules"] = Module.objects.all()
и итерация по modules
в course_detail.html
:
{{ course.description|safe }}
{% for module in modules %}
<div>
<h2><a href="{{ module.get_absolute_url }}">{{ modules.title }}</a></h2>
</div>
{% endfor %}
Я получу все экземпляры Module, но мне нужны только те, которые относятся к конкретному курсу.
Я знаю, что мне нужно фильтровать context["modules"]
, но я не знаю, как это сделать.
Из-за того, что я хочу отображать модули в CourseDetailView
я не могу получить module.pk
через super(CourseDetailView, self).get_context_data(**kwargs)
.
Большое спасибо заранее
Насколько я понял, вам нужно что-то вроде Module.objects.filter(course_id=id), где id - это id конкретного курса. Этот набор запросов является обычным случаем. Как вы сказали в комментариях, для вашего случая необходимо: Module.objects.filter(course_id=self.object)