Python 如何按数量获得前5名用户(两个表相互连接)?

Python 如何按数量获得前5名用户(两个表相互连接)?,python,django,Python,Django,我的模型: class Institution(models.Model): name = models.CharField(max_length=128) description = models.CharField(max_length=256) type = models.CharField(choices=type_of_organization, default=1, max_length=32) categories = models.ManyToMa

我的模型:

class Institution(models.Model):
    name = models.CharField(max_length=128)
    description = models.CharField(max_length=256)
    type = models.CharField(choices=type_of_organization, default=1, max_length=32)
    categories = models.ManyToManyField(Category)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)

class Donation(models.Model):
    quantity = models.IntegerField()
    institution = models.ForeignKey(Institution, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
如何按每家机构的数量获得前5名用户? 例如,对于机构_id=1

elements = Donation.objects.filter(Institution.id=1).order_by('quantity')[:5]
您现在可以获得Institution id=1的捐赠对象,当您将其传递到模板时,您可以执行以下操作:

 {% for element in elements %} 
  {{ element.user }}     
 {% endfor %} 
或者您可以通过以下方式获取用户名:

 {{ element.user.username }}
这将为您筛选的特定机构提供前5名捐款最多的用户

如果你想得到每个用户的捐款总额,并计算出谁的出价最高

此问题的第一个解决方案

要更改您的型号,请执行以下操作: user=models.ForeignKey(user,on_delete=models.CASCADE,unique=True) 您的用户应该是唯一的,因此每次用户进行捐赠时,您都应该增加以前的数量。没有另一张桌子。在views.py中更改存储数据的方式。伪代码如下所示:(如果用户之前进行了捐赠: 捐赠。数量+=新捐赠)

第二种解决方案

你将制作一本词典来记录用户和捐款情况。 在your views.py中尝试以下操作:

  elements = Donation.objects.filter(Institution.id=1).order_by('quantity')
  donationlist = {} //created an empty dict.
  for element in elements:
   donation = element.quantity
   user = element.user 
   if user not in donationlist:
       donationlist.add(user,donation) #now if the user hasn't made a donation yet it will create new key-pair in our dictionary. 
   else: 
       previousdonation = donationlist[user]
       sum = previousdonation + donation
       donationlist[user] = sum 
       # now we updated the users donation successfully if had another donation before. 

    print(donationlist). 
您现在可以获得Institution id=1的捐赠对象,当您将其传递到模板时,您可以执行以下操作:

 {% for element in elements %} 
  {{ element.user }}     
 {% endfor %} 
或者您可以通过以下方式获取用户名:

 {{ element.user.username }}
这将为您筛选的特定机构提供前5名捐款最多的用户

如果你想得到每个用户的捐款总额,并计算出谁的出价最高

此问题的第一个解决方案

要更改您的型号,请执行以下操作: user=models.ForeignKey(user,on_delete=models.CASCADE,unique=True) 您的用户应该是唯一的,因此每次用户进行捐赠时,您都应该增加以前的数量。没有另一张桌子。在views.py中更改存储数据的方式。伪代码如下所示:(如果用户之前进行了捐赠: 捐赠。数量+=新捐赠)

第二种解决方案

你将制作一本词典来记录用户和捐款情况。 在your views.py中尝试以下操作:

  elements = Donation.objects.filter(Institution.id=1).order_by('quantity')
  donationlist = {} //created an empty dict.
  for element in elements:
   donation = element.quantity
   user = element.user 
   if user not in donationlist:
       donationlist.add(user,donation) #now if the user hasn't made a donation yet it will create new key-pair in our dictionary. 
   else: 
       previousdonation = donationlist[user]
       sum = previousdonation + donation
       donationlist[user] = sum 
       # now we updated the users donation successfully if had another donation before. 

    print(donationlist). 

谢谢,有一个问题-我有5个捐款最多的用户,而不是他们的总和,例如-用户捐款1次,数量为100,将高于2次捐款60数量每个。它的工作:)太感谢了,我应该自己发现字典是需要的,我试着做一个查询。谢谢,有一个问题-我有5个捐款最多的用户,而不是他们的总和,例如-用户捐款1次,数量为100,将高于2次捐款60个数量。它的工作:)太感谢了,我应该自己发现字典是需要的,我只是试图提出一个查询。