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

Posted

技术标签:

【中文标题】是否过滤 Django Rest Framework (DRF) 中的代码示例优化问题【英文标题】:Filtering code example optimization issue in Django Rest Framework (DRF) or Not 【发布时间】: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 的东西?

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于是否过滤 Django Rest Framework (DRF) 中的代码示例优化问题的主要内容,如果未能解决你的问题,请参考以下文章

如何从 django-rest-framework 中的文件列表中过滤图像

django.test.client 上的 Django rest 框架导入错误

无法使用 Django Rest 框架发送压缩的 gzip 数据

Django REST to React - 无需密码即可获取社交身份验证令牌

Django Rest:为啥访问被拒绝,尽管 AccessAny 被设置为权限?

尽管有 AllowAny 权限,django-rest-framework 在 POST、PUT、DELETE 上返回 403 响应