Справка Django Queryset, подсчет предметов, связанных с предметом - PullRequest
0 голосов
/ 31 декабря 2018

Я делаю веб-приложение для приложения управления запасами, используя Django.В этом веб-приложении ящики для хранения (с содержимым) назначаются людям в моей базе данных.

Я пытаюсь написать набор запросов, который я мог бы зациклить (см. Мой HTML), чтобы получить общее количество блоков, назначенных для каждого проекта, например, Project: Project Green, Total Boxes: 5. У меня проблемы с написаниемэтот.Я пытался использовать _Set для обратного поиска и функции подсчета, но я не могу заставить что-либо работать.

Может ли кто-нибудь указать мне правильное направление?

Я упростилмой код ниже.

Моя модель:

class Box(models.Model):
    box_contents = models.CharField(max_length=300, blank=True, null=True) 
    project_assigned_to = models.ForeignKey('Project', null=True)
    Location = models.OneToOneField('Location', null=True)

class Project(models.Model):
    project_name = models.CharField(max_length=255, blank=False, null=True)

Мой вид:

def page(request):
    project_data = Project.objects.all()
    return render(request, 'main_app/page.html' , 
    {"project_data":project_data})

Мой HTML:

{% for item in project_data %}
<p>Project Name: {{ item.project_name }}</p>
<p>Number of Boxes Assigned: {{ item.Box_set.box_contents.count }}</p>
{% endfor %}

1 Ответ

0 голосов
/ 31 декабря 2018

Вы можете сосчитать количество Box es, связанных с Project с помощью:

{{ item.<b>box_set.count</b> }}

Но это приведет к известной проблеме N + 1 : вы будетесделать дополнительный запрос за элемент .Вы можете избежать этого, аннотируя сначала набор запросов числом Box es, например:

from django.db.models import <b>Count</b>

def page(request):
    project_data = Project.objects.annotate(
        <b>nboxes=Count('box')</b>
    )
    return render(request, 'main_app/page.html' , 
    {"project_data":project_data})

Теперь Project s в этом QuerySet будет иметь дополнительныйатрибут с именем nboxes, поэтому вы можете отобразить это с помощью:

{% for item in project_data %}
<p>Project Name: {{ item.project_name }}</p>
<p>Number of Boxes Assigned: {{ <b>item.nboxes</b> }}</p>
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...