Django REST-queryset order_by不能按降序工作

时间:2019-07-24 16:27:57

标签: python django django-rest-framework

目前,我正在学习Django和Django Rest框架,并且正在从事一个API项目。该项目是关于从数据库返回有关文本记录的简单统计信息。我想从数据库中列出十个最常用的单词。

这是models.py文件:

from django.db import models

class Word(models.Model):
    word = models.CharField(max_length = 100)
    word_count = models.IntegerField()

    class Meta:
        db_table = 'djangorest_word'
        managed = False

这是view.py文件:

from rest_framework.response import Response
from rest_framework import generics
from djangorest.api.models import Word, Author, WordPerAuthor
from djangorest.api.serializers import WordSerializer, AuthorSerializer, WordPerAuthorSerializer
from django.db.models import Sum 

class WordList(generics.ListAPIView):
    queryset = Word.objects.values('word', 'word_count').order_by('word_count').annotate(Sum('word_count'))[:10]
    serializer_class = WordSerializer
    def get(self, request):
        queryset = self.filter_queryset(self.get_queryset())
        serializer = self.get_serializer(queryset, many=True)
        data = {obj['word']: obj['word_count'] for obj in serializer.data}
        return Response(data)

升序正常工作:

{
    "Karolina": 1,
    "hand": 1,
    "correctness": 1,
    "inform": 1,
    "memory": 1,
    "Possible": 1,
    "modules": 1,
    "guy": 1,
    "pitching": 1,
    "expensive": 1
}

但是每当我使用order_by('-word_count')order_by('word_count').reverse()时,单词不会只有十个,只有两个:

{
    "the": 1120,
    "to": 1104
}

我不明白为什么order_by可以按升序正常工作,而不能按降序工作。我想念什么吗?还有其他方法可以接收十大值吗?

1 个答案:

答案 0 :(得分:1)

涉及注释时,QuerySet函数的顺序很重要。特别是,您要在之后进行排序。 This answer有一个很好的例子。

所以在您的情况下:

Word.objects.values('word') \
    .annotate(word_count=Sum('word_count')) \
    .order_by('-word_count')[:10]