【问题标题】:Django Filter Queryset by Highest RatingDjango 按最高评分过滤查询集
【发布时间】:2013-02-01 15:37:55
【问题描述】:

我有一个允许对其对象进行评级的模型,并且我希望能够按最高评级进行过滤,这是一个可以是正整数或负整数的数字范围:

class Thing(models.Model):
    user = models.ForeignKey(User)
    created_on = models.DateTimeField(auto_now_add=True)
    rating = VotingField(can_change_vote=True)
    ....

VotingField 来自a fork of django-ratings

如何将此查询集过滤为order_by 是所有Thing 对象中最大的rating?感谢您的想法!

【问题讨论】:

    标签: django filter django-queryset


    【解决方案1】:

    我不确定您是想要最高平均值还是最高总和,因此您可能需要更改注释

    from django.db.models import Sum, Avg
    
    Thing.objects.annotate(avg_rating=Avg('rating__score')).order_by('-avg_rating')
    Thing.objects.annotate(sum_rating=Sum('rating__score')).order_by('-sum_rating')
    

    https://docs.djangoproject.com/en/dev/ref/models/querysets/#annotate

    看起来您正在调用您的 VotingField rating,它看起来本质上与 Vote 模型相比有很多。所以我们想要每个ThingVote 集合的score 字段的总和或平均值。 (我认为它是我们想要注释的分数字段https://github.com/Kronuz/django-ratings/blob/master/djangoratings/models.py#L15,但我不使用这个插件,所以如果这不是你需要的,请做一些研究)

    【讨论】:

    • 谢谢!这是非常有用的!出于某种原因,rating_score 工作而不是rating__score,所以最后我使用了:Thing.objects.annotate(sum_rating=Sum('rating_score')).order_by('-sum_rating')。谢谢您的意见。它解决了我的问题!
    • 我正在尝试这个解决方案,它似乎工作正常。这是我第二次使用 django-ratings 并且我试图通过文档中的解释来实现这一点,但最后,就像第一次一样,我最终使用了注释。 @Nick B 关于 rating_score 的说法对我来说也是正确的,如果不是,我会收到 FiledError 并且 Django 提醒我我需要在 rating_score 和 rating_votes 之间进行选择。
    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 2018-09-26
    • 1970-01-01
    • 2013-04-20
    • 2012-05-18
    • 2019-02-09
    • 1970-01-01
    • 2020-08-22
    相关资源
    最近更新 更多