Python 查找在多次付款中花费最多的客户

Python 查找在多次付款中花费最多的客户,python,django,django-models,django-queryset,Python,Django,Django Models,Django Queryset,因此,我有一个名为“购买”的模型,我需要将所有付款相加,找出谁是收入最高的客户 我现在使用的方法是相当迟钝的,我知道它可以大幅缩小,什么是最好的方法呢 例如: class Purchases(models.Model): price = models.DecimalField("Price", max_digits=18, decimal_places=2) username = models.CharField("Username", max_length=50) 我需要查询

因此,我有一个名为“购买”的模型,我需要将所有付款相加,找出谁是收入最高的客户

我现在使用的方法是相当迟钝的,我知道它可以大幅缩小,什么是最好的方法呢

例如:

class Purchases(models.Model):
    price = models.DecimalField("Price", max_digits=18, decimal_places=2)
    username = models.CharField("Username", max_length=50)
我需要查询这个模型,例如有12个条目都属于Customer1、Customer2和Customer3

  • Customer1有4笔单独付款,总计100英镑
  • Customer2有2笔单独付款,总计75英镑
  • Customer3有6笔单独付款,总计300英镑
我需要找到花费最多的客户,在本例中,这将是总花费价值为300英镑的customer3

下面是我刚刚提出的一个代码示例,但我知道它可以得到很大的改进:

def find_top_customer(self)
    top_donor = None
    spent = None
    for customer in Purchase.objects.filter(marketid=self.marketid):
        customer_spent = Purchase.objects.filter(marketid=self.marketid,username=customer.username).aggregate('price')[0]
        if customer_spent > spent:
            top_donor = customer.username
            spent = customer_spent

我认为您应该定义一些函数,如:

allPurchases(client)
findPurchase(id, client)

然后玩这些游戏来获得你想要的数据。

好的,我已经弄明白了,很抱歉回答不好。。。(代码测试)

如果您的购买模型中有用户外键:

class Purchase(models.Model):
    price = models.DecimalField("Price", max_digits=18, decimal_places=2)
    user = models.ForeignKey('auth.User', related_name='purchase_set')
您可以通过以下方式获得最具购买力的用户:

from django.db.models import Sum
most_purchasing_user = User.objects.annotate(purchase_sum=Sum('purchase_set__price')).order_by('-purchase_sum')[0]
说明: 对于所有用户,我们汇总他们的购买集合并计算购买价格之和,然后按最大的购买集合总和订购,并使用[0]获得第一个

警告 这对数据库来说是一个很大的开销,你应该考虑把结果放到缓存中。

您需要提供更多信息。告诉我们你现在有什么,样本输入/表格,以及你想要的输出看起来是什么样的。如果你有工作代码,我会考虑把它转到我的代码是相当丑陋的,我宁愿不分享它,它让我感觉很糟糕LOL。SAMBK金汉姆没有理由感到羞愧,这是我们所有人都必须学习的。@ USER 2097 159我通常不会,但我知道这是一个相当简单的解决方案,但我似乎无法理解它,我认为我的示例只会让事情变得更难理解。这真的一点帮助都没有。这是一个很好的答案,我知道我必须使用聚合,但我忘记了顺序和索引。但是有没有办法删除forloop?因此,不必对每个客户进行循环?不需要按价格进行订购,我想要的是所有价格的总和,而不是最高价格。使用工作和测试的解决方案更新了我的Answare。。。很抱歉回答不好谢谢你你的回答很完美,我知道它可以被大大简化。