【问题标题】:Django filter sort by number of ForeignKey related objectsDjango过滤器按ForeignKey相关对象的数量排序
【发布时间】:2017-02-24 22:42:09
【问题描述】:

我有一个网站,其中列出了远足,用户可以记录他们已经进行了这些远足。我有一个搜索功能,我希望能够按照我的用户完成的次数对我的远足列表进行排序。我发现这篇文章似乎相关,但指的是外键模型中的特定字段,而我只想计算实例总数: 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')

【问题讨论】:

    标签: python django


    【解决方案1】:

    在视图中:

    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 %}
    

    【讨论】:

    • 这很好用。我实际上将它用作搜索字段中的排序选项,但能够对其进行修改以使其正常工作。谢谢!我已经编辑了我的原始帖子以包含我的最终代码。
    • 它会给你重复的值。
    猜你喜欢
    • 2011-01-31
    • 2010-09-20
    • 2011-12-06
    • 1970-01-01
    • 2012-07-23
    • 2020-01-19
    • 2013-05-06
    • 2010-09-20
    • 2019-02-14
    相关资源
    最近更新 更多