Django过滤器按ForeignKey相关对象的数量排序

时间:2017-02-24 22:42:09

标签: python django

我有一个目录远足的网站,用户可以记录他们已经进行了这些远足。我有一个搜索功能,我希望能够按照用户完成的次数对我的徒步列表进行排序。我发现这篇文章看似相关,但是指的是外键模型中的特定字段,而我只想计算实例的总数: Django QuerySet ordering by number of reverse ForeignKey matches

以下是一些示例代码:

models.py:

class Hikes(models.Model)
...    

class UserLog(models.Model)
     user = models.ForeignKey(User, on_delete=CASCADE)
     hike = models.ForeignKey(Hikes, on_delete=CASCADE)

我需要从我的Hikes模型生成一个查询集,该模型计算UserLog引用每次加息的次数,然后从大多数引用到最少引用命令。像这样:

Hikes.objects.order_by(对于每次徒步旅行,计算UserLog中的引用数量,然后按引用数量排序)

因此,如果Hike#1有10个UserLog实例,Hike#2有20个,而Hike#3有5个,则QuerySet将返回: 远足#2,远足#1,远足#3

任何提示?

编辑:感谢viviwill,这是搜索字段中的工作代码:

def hike_list(request):
    qs = Hikes.objects.all()
    ...
    if request.GET:
        ...
        searchsort = request.GET.get('sortby', '')
        if searchsort == 'sortlocalrepeats':
            qs = qs.annotate(count=Count('userlog')).order_by('-count')

1 个答案:

答案 0 :(得分:2)

观点:

context['rank_hike'] = Hikes.objects.annotate(number_of_hikes=Count('UserLog')).order_by('-number_of_hikes')

在模板中:

{% for hike in rank_hike %}
<p>{{ hike }} {{ hike.number_of_entries }}</p>
{% endfor %}