Django Отображение количества записей в базе данных, связанных по внешнему ключу
У меня есть две модели, ProjectNotes и ProjectNoteComments. ProjectNoteComments связаны с ProjectNotes через внешний ключ. Я хочу отображать количество комментариев к каждой заметке в виде списка. Я только изучаю Django и пока не могу понять, как получить и отобразить количество комментариев.
Мое мнение:
(I do import count)
class ProjectNotesList(ListView):
model = ProjectNotes
template_name = 'company_accounts/project_notes.html'
comments = ProjectNotes.comments
def related_project(self, **kwargs):
project = get_object_or_404(Project, id=self.kwargs.get('pk'))
notes = ProjectNotes.objects.all
return notes
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super().get_context_data(**kwargs)
context['project'] = get_object_or_404(Project, id=self.kwargs.get('pk'))
return context
commentscount = ProjectNotes.objects.annotate(num_comments=Count('comments'))
Мой шаблон:
{% extends 'base.html' %}
{% block content %}
<div class="section-container container">
<h1>Notes for {{ project }}</h1>
{% if project.notes.all %}
{% for note in project.notes.all %}
<div class ="projectnotes-entry">
<div class="col-sm-8">
<div class="row-sm-6">
<div class="card mb-2">
<div class="card-body">
<div class="card-title"><a href="{% url 'project_note_detail' project.pk note.pk %}">{{ note.title }}</a></div>
<div class="card-text">{{ note.body | safe | truncatewords:"20"|linebreaks }}
<a href="{% url 'project_note_detail' project.pk note.pk %}">read more</a></div>
</div>
</div>
</div>
</div>
</div>
<h2>comments count</h2>
{{ commentscount }}
{% endfor %}
{% else %}
<p>No notes have been have been added yet.</p>
{% endif %}
</div>
{% endblock content %}
Модели:
class ProjectNotes(models.Model):
title = models.CharField(max_length=200)
body = tinymce_models.HTMLField()
date = models.DateField(auto_now_add=True)
project = models.ForeignKey(Project, default=0, blank=True, on_delete=models.CASCADE, related_name='notes')
def __str__(self):
return self.title
class ProjectNoteComments(models.Model):
body = tinymce_models.HTMLField()
date = models.DateField(auto_now_add=True)
projectnote = models.ForeignKey(ProjectNotes, default=0, blank=True, on_delete=models.CASCADE, related_name='comments')
Краткая версия:
{{ note.comments.all.count }} # possibly works also without 'all' but can't check right now
Я только что ответил на похожую проблему с простым объяснением отношений. https://stackoverflow.com/a/70955851/12775662
Читайте официальную документацию, это действительно полезно. https://docs.djangoproject.com/en/4.0/topics/db/models/#relationships