找出客户在多笔付款中花费最多的钱

时间:2015-02-24 14:13:52

标签: 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)

我需要查询这个模型,例如有12个条目都属于Customer1,Customer2和Customer3

  • 客户1有4笔单独的付款,总计100英镑
  • 客户2有2笔单独的付款,总计为75英镑
  • 客户3有6笔单独付款,总计300英镑

我需要找到在这个例子中花费最多的客户,它将是customer3,总花费为300英镑。

这是我刚刚提出的一个代码示例,但我知道它可以大大改善:

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

2 个答案:

答案 0 :(得分:2)

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

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

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]

说明: 对于所有用户,我们汇总theire purchase_set并执行购买价格总和,然后我们按最大purchase_set总和订购,并获得第一个[0]

警告 这对数据库来说是一个很大的代价,你应该考虑将结果放入缓存中 Django Cache Framework

答案 1 :(得分:0)

我认为你应该修改一些功能,如:

allPurchases(client)
findPurchase(id, client)

并使用这些来获取您想要的数据。