排序查询集的好方法?

我想要做的是这样的:

  • 获得最高分数的30位作者( Author.objects.order_by('-score')[:30]

  • last_name命令作者


  • 有什么建议么?


    关于什么

    import operator
    
    auths = Author.objects.order_by('-score')[:30]
    ordered = sorted(auths, key=operator.attrgetter('last_name'))
    

    在Django 1.4和更新版本中,您可以通过提供多个字段进行排序。
    参考:https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by

    ORDER_BY(*字段)

    默认情况下,由QuerySet返回的结果由模型Meta中的ordering选项给出的排序元组ordering 。 您可以通过使用order_by方法在每个QuerySet的基础上覆盖此值。

    例:

    ordered_authors = Author.objects.order_by('-score', 'last_name')[:30]
    

    上述结果将被责令score下降的,那么last_name上升。 "-score"前的负号表示降序。 暗示升序。


    我只想说明内置解决方案(仅限于SQL)并不总是最好的解决方案。 起初我认为,因为Django的QuerySet.objects.order_by方法接受多个参数,所以你可以很容易地链接它们:

    ordered_authors = Author.objects.order_by('-score', 'last_name')[:30]
    

    但是,它不会像你所期望的那样工作。 举例来说,首先是根据分数排序的总统名单(选择前5名以便阅读):

    >>> auths = Author.objects.order_by('-score')[:5]
    >>> for x in auths: print x
    ... 
    James Monroe (487)
    Ulysses Simpson (474)
    Harry Truman (471)
    Benjamin Harrison (467)
    Gerald Rudolph (464)
    

    使用亚历马尔泰利的解决方案,准确地提供最高5人排序last_name

    >>> for x in sorted(auths, key=operator.attrgetter('last_name')): print x
    ... 
    Benjamin Harrison (467)
    James Monroe (487)
    Gerald Rudolph (464)
    Ulysses Simpson (474)
    Harry Truman (471)
    

    现在联合order_by调用:

    >>> myauths = Author.objects.order_by('-score', 'last_name')[:5]
    >>> for x in myauths: print x
    ... 
    James Monroe (487)
    Ulysses Simpson (474)
    Harry Truman (471)
    Benjamin Harrison (467)
    Gerald Rudolph (464)
    

    正如你所看到的,它与第一个结果是一样的,这意味着它不像你所期望的那样工作。


    这是一种允许关闭分数的方法。

    author_count = Author.objects.count()
    cut_off_score = Author.objects.order_by('-score').values_list('score')[min(30, author_count)]
    top_authors = Author.objects.filter(score__gte=cut_off_score).order_by('last_name')
    

    您可以通过这种方式在top_authors中获得超过30位作者,而min(30,author_count)则是因为您的作者少于30位。

    链接地址: http://www.djcxy.com/p/38711.html

    上一篇: Good ways to sort a queryset?

    下一篇: In Django, how does one filter a QuerySet with dynamic field lookups?