Как получить количество связей по внешнему ключу для каждого экземпляра в наборе запросов?
У меня есть следующие модели:
# 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
с количеством связанных PollerComment
s.
Если вы используете это как poller_queryset
, вы можете использовать это в вашем шаблоне как:
{% for poller in qs_list %}
{{ poller.poller_id }}: {{ poller.ncomments }}
{% endfor %}