【问题标题】:Filtering code example optimization issue in Django Rest Framework (DRF) or Not是否过滤 Django Rest Framework (DRF) 中的代码示例优化问题
【发布时间】:2020-08-02 14:45:52
【问题描述】:

最近我在 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

看来上面的sn-p代码写成这样会更有效率,

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 的东西?

【问题讨论】:

    标签: django optimization django-rest-framework filtering django-orm


    【解决方案1】:

    只要不评估查询集,就没有数据库活动。

    回答这个问题:不,第二个代码示例实际上效率并不高。

    例子:

    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

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 1970-01-01
      • 2021-08-10
      • 2020-09-08
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 2014-06-06
      相关资源
      最近更新 更多