当月前5名客户(django)

uinbv5nw  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(365)

我的订单型号如下:

class Order(models.Model):
    order_date = models.DateField()
    value = models.FloatField(default=0.00)
    customer = models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL, related_name='orders')
    customer_city = models.ForeignKey(CustomerCity, null=True, on_delete=models.SET_NULL, related_name='orders_city')

我想在我的模板文件中生成一个当月前5名客户的表格(基于收到的订单总额),其中包含('customer'、'city'、'orders count'和'orders sum')字段。
他对如何获取这些数据完全感到困惑和不知所措。但是,在my views.py文件中尝试了以下代码:

today = datetime.date.today()
top_five_customers = Order.objects.filter(order_date__year=today.year, order_date__month=today.month).values('customer').annotate(orders_count=Count('customer'), orders_sum=Sum('value')).order_by('-orders_sum',)[:5]

然后在我的模板文件中,我有以下内容:

{% for customer in top_five_customers %}
    <tr>
        <td>{{ customer.customer }}</td>
        <td>{{ customer.customer_city }}</td>
        <td>{{ customer.orders_count }}</td>
        <td>{{ customer.orders_sum }}</td>
    </tr>
{% endfor %}

提前谢谢。

taor4pac

taor4pac1#

您可以先筛选相关对象,然后 Sum 向上 value ,并按该值排序:

start_month = date.today().replace(day=1)

Customer.objects.filter(
    order__order_date__gte=start_month
).annotate(
    total=Sum('order__value')
).order_by('-total')[:5]

因此,此查询集将包含 Customer 物体。这个 Customer 由此产生的问题 QuerySet 将包含一个额外属性 .total 这是订单的总数。
使用django-3.2,我们可以稍微提高效率 .alias(…) [django doc]在这种情况下,没有额外的属性用于 Customer s:

start_month = date.today().replace(day=1)

Customer.objects.filter(
    order__order_date__gte=start_month
).alias(
    total=Sum('order__value')
).order_by('-total')[:5]
8i9zcol2

8i9zcol22#

尝试开始使用sql视图。更易于开发和维护。

相关问题