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()?

Вернуться на верх