2015-02-24 76 views
0

因此,我有一个名为Purchases的模型,我需要通过将所有付款加起来找到最高付费客户。找到客户在多次付款中花费最多的钱

我现在使用的方法相当迟钝,我知道它可以大规模收缩,对此最好的方法是什么?

例如:

class Purchases(models.Model): 
    price = models.DecimalField("Price", max_digits=18, decimal_places=2) 
    username = models.CharField("Username", max_length=50) 

我需要查询这个模型,例如具有12个条目的所有属于customer1表,顾客2和Customer3

  • customer1表具有总计为100£4个独立的付款
  • Customer2有2笔独立付款,总计£75
  • Customer3有6笔独立付款,总计£300

我需要找到在这个例子中花费最多的客户,它将是客户3,总共花费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 
+0

您需要提供更多信息。向我们展示您现在拥有的产品,样品输入/表格以及您希望输出的样子。 – 2015-02-24 14:16:32

+0

如果你有工作代码,我会考虑把它交给http://codereview.stackexchange.com/ – user2097159 2015-02-24 14:23:00

+0

我的代码相当丑陋,我宁愿不分享它,这让我感觉非常糟糕。 – 2015-02-24 14:25:49

回答

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做采购价格的总和,那么我们ORDER_BY最大purchase_set总和,并获得先用[0]

警告 这是一个很大的成本的数据库,你应该考虑到PU结果在高速缓存中 Django Cache Framework

+0

这是一个很好的答案,我知道我将不得不使用聚合,但我忘记了顺序和索引。 – 2015-02-24 15:54:46

+0

但是有什么办法可以删除forloop?所以不必循环遍历每个客户? – 2015-02-24 15:59:29

+0

按价格排序是不需要的,我想所有的价格都不是最高的。 – 2015-02-24 16:18:50

0

我想你应该变形点焊上的一些功能,如:

allPurchases(client) 
findPurchase(id, client) 

和娱乐用这些来获得你想要的数据。

+0

这确实没有帮助。 – 2015-02-24 14:36:31

相关问题