是否在 Django Rest Framework (DRF) 中过滤代码示例优化问题

Filtering code example optimization issue in Django Rest Framework (DRF) or Not

最近我在 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 的某些内容?

只要查询集不求值,就没有数据库activity。

回答问题:不,第二个代码示例实际上并没有更有效。

示例:

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 docs