方案一:
重写get_queryset
根据查询参数过滤
过滤初始查询集的最后一个示例是根据 url 中的查询参数确定初始查询集。
我们可以覆盖.get_queryset()
以处理诸如 之类的 URL http://example.com/api/purchases?username=denvercoder9
,并且仅当username
URL 中包含参数时才过滤查询集:
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')
if username is not None:
queryset = queryset.filter(purchaser__username=username)
return queryset
方案二:通用过滤器
自定义通用过滤
您还可以提供自己的通用过滤后端,或编写一个可安装的应用程序供其他开发人员使用。
这样做覆盖BaseFilterBackend
,并覆盖.filter_queryset(self, request, queryset, view)
方法。该方法应该返回一个新的、过滤的查询集。
除了允许客户端执行搜索和过滤之外,通用过滤器后端还可用于限制哪些对象应该对任何给定请求或用户可见。
例子
例如,您可能需要限制用户只能看到他们创建的对象。
class IsOwnerFilterBackend(filters.BaseFilterBackend):
"""
Filter that only allows users to see their own objects.
"""
def filter_queryset(self, request, queryset, view):
return queryset.filter(owner=request.user)
我们可以通过覆盖get_queryset()
视图来实现相同的行为,但使用过滤器后端可以让您更轻松地将此限制添加到多个视图,或将其应用于整个 API