Проблема оптимизации примера кода в Django Rest Framework (DRF) или нет - PullRequest
1 голос
/ 20 апреля 2020

Недавно я придумал следующий код в документации DRF для фильтрации набора запросов в APIListView,

class PurchaseList(generics.ListAPIView):
    serializer_class = PurchaseSerializer

    def get_queryset(self):
        """
        Optionally restricts the returned purchases to a given user,
        by filtering against a `username` query parameter in the URL.
        """
        queryset = Purchase.objects.all()
        username = self.request.query_params.get('username', None)
        if username is not None:
            queryset = queryset.filter(purchaser__username=username)
        return queryset

Кажется, что если приведенный выше фрагмент кода написан следующим образом, он будет более эффективным,

class PurchaseList(generics.ListAPIView):
    serializer_class = PurchaseSerializer

    def get_queryset(self):
        """
        Optionally restricts the returned purchases to a given user,
        by filtering against a `username` query parameter in the URL.
        """
        queryset = None
        username = self.request.query_params.get('username', None)
        if username is not None:
            queryset = queryset.filter(purchaser__username=username)
        else:
            queryset = Purchase.objects.all()
        return queryset

Я не прав? или я что-то упускаю из-за Django ORM?

1 Ответ

3 голосов
/ 20 апреля 2020

Пока набор запросов не оценивается, активность базы данных отсутствует.

Чтобы ответить на вопрос: Нет, второй пример кода на самом деле не более эффективен.

Пример:

qs = Model.objects.all()  # no database activity

qs = qs.filter(**some_filter)  # still no activity

list(qs)  # data is being fetched now

qs = qs.filter(**other_filter)  # no new activity

list(qs)  # new activity again

Также см. django документы .

...