所以我有一个名为“购买”的模型,我需要通过将所有付款加起来来找到最高收入客户。
我目前的方法相当迟钝,我知道它可以大规模缩小,最好的方法是什么?
例如:
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
我需要找到在这个例子中花费最多的客户,它将是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
答案 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)
并使用这些来获取您想要的数据。