是否过滤 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 响应