Как получить количество связей по внешнему ключу для каждого экземпляра в наборе запросов?

У меня есть следующие модели:

# app_a/models.py

class Poller(models.Model):
    poller_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created_on = models.DateTimeField(auto_now_add=True)

# app_b/models.py

class PollerComment(models.Model):
    poller = models.ForeignKey(Poller, on_delete=models.CASCADE, related_name='PollerComment')
    user = models.ForeignKey(Account, on_delete=models.CASCADE)

И это представление для рендеринга шаблона:

def render_pollboard(request):

    # Query Pollers
    poller_queryset = Poller.objects.all()

    # Convert to list
    qs_list = list(poller_queryset)

    # Shuffle the list
    shuffle(qs_list)

    # Retrieve comment count per Poller
    comments_qs = PollerComment.objects.filter(poller_id=poller.poller_id)
[..]

В представлении я пытаюсь получить количество комментариев для каждого Poller в poller_queryset. Как это сделать?

Примечание: я пытался реализовать подсчет комментариев как метод для модели Poller, но из-за моего дизайна это приводит к ошибке циклического импорта модуля из app_b/models.py

вы можете использовать экземпляр poller для получения количества его внешних ключей

for poll in poller_queryset:
    poll.PollerComment_set.count() // gives you the count of comment for that poll

также вы можете использовать Count

from django.db.models import Count
Poller.objects.annotate(
    ncomments=Count(PollerComment)
)

Вы можете работать с .annotate(…) [Django-doc] здесь:

from django.db.models import Count

Poller.objects.annotate(
    ncomments=Count('PollerComment')
)

Poller объекты, возникающие из этого кверисета, будут иметь дополнительный атрибут .ncomments с количеством связанных PollerComments.

Если вы используете это как poller_queryset, вы можете использовать это в вашем шаблоне как:

{% for poller in qs_list %}
    {{ poller.poller_id }}: {{ poller.ncomments }}
{% endfor %}
Вернуться на верх