DRF не переоценивает набор запросов, как ожидалось.
Это вопрос о том, работает ли DRF так, как должна, или ее можно улучшить, чтобы учесть этот случай использования.
У меня есть простой API, который возвращает пользовательский набор запросов следующим образом:
class WorldRankingViewset(viewsets.ReadOnlyModelViewSet):
queryset = Ranking.objects.world_ranking()
Где находится пользовательский набор запросов:
class RankingQuerySet(models.QuerySet):
def world_rankings(self, rank_type="World"):
# get most recent update
update = RankingUpdate.objects.issued().filter(rank_type=rank_type, date__lte=TODAY).order_by("-asat", "-date").first()
# if there is one, get all the player rankings for that update
if update:
return self.filter(update=update, player_id__gt=0, points__gt=0)
else:
return self.none()
В коде generics.py из DRF функция get_queryset имеет такой код:
def get_queryset(self):
....
queryset = self.queryset
if isinstance(queryset, QuerySet):
# Ensure queryset is re-evaluated on each request.
queryset = queryset.all()
return queryset
Учитывая комментарий "Ensure queryset is re-evaluated on each request", я ожидал, что он будет это делать.
Однако, когда я запускаю свой тест API, происходит следующая последовательность действий.
Evaluation queryset
Run setUpTestData() to populated data for test
Make call to api without re-evaluating queryset
Return no data
Если я помещаю пользовательский код get_queryset в api, то все работает, как я ожидаю, и возвращает тестовые данные:
class WorldRankingViewset(viewsets.ReadOnlyModelViewSet):
queryset = Ranking.objects.none()
def get_queryset(self):
return Ranking.objects.world_rankings()
Run setUpTestData() to populated data for test
Make call to api
Evaluate queryset
Return data
Если я изменяю свой пользовательский кверисет на прямой фильтр, то оригинальный код работает правильно, поэтому мой вопрос заключается в том, так ли должен работать DRF и не так ли, есть ли лучший способ принудительной переоценки кверисета, кроме queryset = queryset.all()?