【问题标题】:Count & Sum of Order Values for each customer (through iteration) in DjangoDjango中每个客户的订单价值计数和总和(通过迭代)
【发布时间】:2021-06-15 11:41:52
【问题描述】:

我的客户和订单模型如下:

class Customer(models.Model):
    name = models.CharField(max_length = 100)
    city = models.CharField(max_length = 100)

class Order(models.Model):
    value = models.FloatField()
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)

现在我想生成一个(不同的)客户表,以及他们每个人下的订单数量以及这些订单的价值总和。我在views.py中试过这个:

def customers(request):
    customer_orders = Order.objects.distinct().annotate(Sum('value'))

然后在我的 html 模板中,我尝试了以下操作:

<ul>
{% for customer in customer_orders %}
    <li>{{customer.customer}} - {{customer.value__sum}}<li>
{% endfor %}
</ul>

毕竟,我没有获得唯一客户(以及相应的订单记录),而是获得了所有订单的列表,并且客户正在重复(如下所示)。不知道我在这里缺少什么。

博斯科沃德 - 16,700.0 Ernser PLC - 51,200.0 墨菲有限公司 - 21,400.0 科勒-维姆 - 29,200.0 施密特-莱格罗斯 - 96,800.0 布朗-魏斯纳特 - 8,200.0 博斯科沃德 - 36,400.0 Ernser PLC - 66,600.0 墨菲有限公司 - 84,200.0

还想知道是否有可能生成一个城市名称表,其中包含从该城市收到的订单数量和订单总值(请注意,我的订单模型没有城市字段)。

【问题讨论】:

    标签: python sql django for-loop


    【解决方案1】:

    由于您想要Customer 实例的查询集在Customer 模型本身而不是Order 上进行查询,接下来我相信您不需要在这里使用distinct,因为应该考虑客户实例独特的。因此,您可以进行如下查询:

    from django.db.models import Count, Sum
    
    
    customers = Customer.objects.annotate(order_count=Count('order'), order_value_sum=Sum('order__value'))
    
    
    for customer in customers:
        print(customer.name, customer.order_count, customer.order_value_sum)
    

    【讨论】:

      【解决方案2】:

      请注意我在没有测试的情况下从手机输入解决方案,但这是我的想法:

      1. 在订单模型中为客户提供相关名称:

      customer = models.ForeignKey(Customer, on_delete=models.CASCADE,related_name=“orders”)

      1. 获取订单数:

      Customer.objects.get(id=1).orders.count()

      或在模板中访问此属性,例如:

      {{ customer.orders.count }}

      1. 按城市获取订单计数值

      从 django.db.models 导入计数,求和

      Customer.objects.values(“city”).annotate(order_count=Count(“orders”)).annotate(totals=Sum(“value”))

      【讨论】:

      • {{ customer.orders.count }} 工作得很好。还有一种方法可以获得“总和”而不是计数吗? Customer.objects.values(“city”).annotate(order_count=Count(“orders”)).annotate(totals=Sum(“value”)) 抛出错误,指出 Customer 模型没有字段 'value '。如果我删除最后一部分(Sum 的注释),代码可以正常工作并显示城市的订单数
      • 对不起,试着把最后一部分改成:annotate(totals=Sum(“orders__value”))
      【解决方案3】:

      将 realted_name 添加到 Order customer 字段:

      class Customer(models.Model):
          name = models.CharField(max_length = 100)
          city = models.CharField(max_length = 100)
      
      class Order(models.Model):
          value = models.FloatField()
          customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='orders')
       
      

      查询:

      Customer.objects.values(“city”).annotate(order_count=Count(“orders”)).annotate(totals=Sum(“orders__value”))
      

      【讨论】:

        猜你喜欢
        • 2013-02-16
        • 2023-01-22
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        • 2011-05-02
        • 2023-02-22
        相关资源
        最近更新 更多