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

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