Django REST - 查询集order_by不按降序工作



目前我正在学习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按升序正常工作,但在降序中不起作用。我错过了什么吗?有没有其他方法可以实现获得前十个值?

当涉及注释时,QuerySet 函数的排序很重要。特别是,您希望在注释后进行排序。这个答案有一个很好的例子。

所以在你的情况下:

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

最新更新