Django, annotation and ordering using data from other table

强颜欢笑 提交于 2020-01-04 09:14:32

问题


In my app there are users who request items and users who donate those items. I would like to fetch all users that made the most donations.

These are my models:

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)

More specifically, I would like to fetch the top-5 donors with the most "completed" donations (where item_request.completed=True). Can I do this with one query?


回答1:


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

You should probably name your Donation.user.related_name donation too.

Then it will be

(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]


来源:https://stackoverflow.com/questions/15743766/django-annotation-and-ordering-using-data-from-other-table

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!