Итак, похоже, у вас немного отключены настройки базового набора запросов.
Я не уверен, что вам нужно заказывать по идентификатору, потому что вы фильтруете по одному идентификатору. Таким образом, все идентификаторы в отфильтрованном фильтрованном объекте QuerySet<>
будут одинаковыми - так что технически он уже упорядочен.
Метод values()
- это способ извлечь QuerySet<>
для итеративной манипуляции ... так сначала вам нужно будет выполнить фильтрацию на cur__id
, равном self.kwargs['id']
.
Далее, извлечь только те значения, которые вы хотите - что выглядит как id
, rate
и volume
( необходимо для последующей аннотации).
Затем используйте агрегатор Avg
, как показано.
Тогда предел? (Я думаю - я не уверен, что это работает для менее чем 10 записей от руки).
Итак, в общем, я бы реализовал это следующим образом:
class RateView(ListAPIView):
serializer_class = RateSerializer
def get_queryset(self):
return Rate.objects.all()
def list(self):
queryset = self.get_queryset().filter(
cur__id=self.kwargs['id']
)
queryset = queryset.values(
'id',
'rate',
'volume'
).annotate(
average_volume=Avg('volume'),
)[:10]
...
Я также изменил ваш метод базового класса "get_queryset()
" для возврата all()
объектов - единственная фильтрация, которую я бы сделал на этом уровне, это очень базовая c фильтрация, например, если бы представление отображало всех female
пользователей (по какой-либо причине) ... так и User.objects.filter (пол = ' female ') будет иметь смысл в качестве базового запроса для построения.
Точка, в которой он оценивается БД, находится на последнем вызове values()
.