目前,我正在学习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
可以按升序正常工作,而不能按降序工作。我想念什么吗?还有其他方法可以接收十大值吗?
答案 0 :(得分:1)
涉及注释时,QuerySet函数的顺序很重要。特别是,您要在之后进行排序。 This answer有一个很好的例子。
所以在您的情况下:
Word.objects.values('word') \
.annotate(word_count=Sum('word_count')) \
.order_by('-word_count')[:10]