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