我正在使用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 %}
答案 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 %}