Django Queryset帮助,计算与item

时间:2018-12-31 20:49:22

标签: django django-queryset

我正在使用Django开发一个用于库存管理应用程序的Web应用程序。在此Web应用程序中,将存储箱(及其内容)分配给我数据库中的人员。

我正在尝试编写一个查询集,我可以对其进行循环(请参阅HTML),以检索分配给每个项目的框总数,例如项目:绿色项目,总计盒子: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 :(得分:2)

您可以使用以下方法计算与Box关联的Project的数量:

{{ item.box_set.count }}

但这会导致著名的 N + 1问题:您将对每个项目进行额外的查询 。您可以通过先用Box个数字注释查询集来避免这种情况,例如:

from django.db.models import Count

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

现在,该Project中的QuerySet个将具有一个名为nboxes的额外属性,因此您可以使用以下方式呈现该属性:

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