【问题标题】:Django, annotation and ordering using data from other tableDjango,使用其他表中的数据进行注释和排序
【发布时间】:2013-04-01 12:46:36
【问题描述】:

在我的应用中,有请求物品的用户和捐赠这些物品的用户。我想获取所有捐款最多的用户。

这些是我的模型:

class ItemRequest(models.Model):
    item_type = models.ForeignKey(ItemType)
    description = models.CharField(max_length=1024, default='', blank=True)
    quantity = models.IntegerField()
    user = models.ForeignKey(User)
    completed = models.BooleanField(default=False)
    completed_dt = models.DateTimeField()


class Donation(models.Model):
    item_request = models.ForeignKey(ItemRequest, related_name='donation')
    user = models.ForeignKey(User, related_name='donor')
    quantity_offered = models.IntegerField(default=0)
    quantity_accepted = models.IntegerField(default=0)

更具体地说,我想获取“完成”捐赠最多的前 5 名捐赠者(item_request.completed=True)。我可以通过一次查询来完成此操作吗?

【问题讨论】:

    标签: django django-models


    【解决方案1】:
    (User.objects
           .filter(donor__item_request__completed=True)
           .annotate(c=Count('donor'))
           .order_by('-c')[:5])
    

    您可能也应该将您的Donation.user.related_name 命名为donation

    那就是

    (User.objects
           .filter(donation__item_request__completed=True)
           .annotate(c=Count('donation'))
           .order_by('-c')[:5])
    

    【讨论】:

      【解决方案2】:
      Donation \
          .objects \
          .select_related('item_request', 'user') \
          .filter(item_request__completed=True) \
          .annotate(num_donations=models.Count('item_request')) \
          .filter(num_donations__gt=0) \
          .order_by("-num_domations")[:5]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-07
        • 2021-01-04
        • 1970-01-01
        • 1970-01-01
        • 2018-01-23
        • 1970-01-01
        • 2018-07-21
        • 2020-06-13
        相关资源
        最近更新 更多