首页 > 解决方案 > For循环在Python中查找匹配值和总计

问题描述

我有一个 Django 项目,其中我的清单模型由项目代码和数量组成。我想遍历模型并找到每个项目代码的总数量。所以我认为有以下几点:

manifest = Manifests.objects.all()

我如何使用 for 循环或其他东西来合计每个项目代码的数量。或者更清楚地说,如果项目代码 10 出现 3 次,数量 = 1、2 和 3。项目代码 10 的总数应该是 6,如果项目代码 20 出现两次,数量 = 2 和 5,总数应该是 7。

这是供参考的模型:

模型.py

class Manifests(models.Model):
    reference = models.IntegerField()
    quantity = models.IntegerField()
    item_code = models.ForeignKey(Products, default=None, blank=True, null=True)

标签: pythondjango

解决方案


请不要使用循环for。您可以使用以下方式注释您的查询集Products

from django.db.models import Sum

Products.objects.annotate(
    total_quantity=Sum('manifests__quantity')
)

Products从此查询集中产生的对象将具有一个额外的属性.total_quantity,该属性将包含相关s 对象的.quantitys的总和。 Manifests

或者您可以只计算带有以下内容的Manifests对象reference=10

from django.db.models import Sum, Q

Products.objects.filter(
    Q(manifests=None) | Q(manifests__reference=10)
).annotate(
    total_quantity=Sum('manifests__quantity')
)

注意:通常模型的名称是单数的,所以Manifest代替Manifests, 和Product代替Products


推荐阅读