在 Django Rest Framework 中,如何处理无效的过滤参数?
In Django Rest Framework, how do handle invalid filtering parameters?
我想限制 ListAPIView
返回的查询集,使用描述的过滤技术 here。
问题是,如何处理无效参数?引发 ValidationError 仅适用于序列化程序,不适用于 ViewSet。我想让用户知道请求无效,而不是默默地失败。
例如:
class PurchaseList(generics.ListAPIView):
serializer_class = PurchaseSerializer
def get_queryset(self):
queryset = Purchase.objects.all()
username = self.request.query_params.get('username', None)
if username is not None:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
# How do I handle this invalid parameter?
else:
queryset = queryset.filter(purchaser=user)
return queryset
使用内置异常,因为您正在响应未找到的内容,请使用 NotFound:
from rest_framework import exceptions
class PurchaseList(generics.ListAPIView):
serializer_class = PurchaseSerializer
def get_queryset(self):
queryset = Purchase.objects.all()
username = self.request.query_params.get('username', None)
if username is not None:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
raise exceptions.NotFound(detail="Some message if you want")
else:
return queryset.filter(purchaser=user)
return queryset
你不能只是 return 一个空列表吗?
queryset = queryset.filter(purchaser__username=username)
如果用户名无效,则此查询集将只是一个空查询集,DRF 将 return 结果为一个空列表。
我想限制 ListAPIView
返回的查询集,使用描述的过滤技术 here。
问题是,如何处理无效参数?引发 ValidationError 仅适用于序列化程序,不适用于 ViewSet。我想让用户知道请求无效,而不是默默地失败。
例如:
class PurchaseList(generics.ListAPIView):
serializer_class = PurchaseSerializer
def get_queryset(self):
queryset = Purchase.objects.all()
username = self.request.query_params.get('username', None)
if username is not None:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
# How do I handle this invalid parameter?
else:
queryset = queryset.filter(purchaser=user)
return queryset
使用内置异常,因为您正在响应未找到的内容,请使用 NotFound:
from rest_framework import exceptions
class PurchaseList(generics.ListAPIView):
serializer_class = PurchaseSerializer
def get_queryset(self):
queryset = Purchase.objects.all()
username = self.request.query_params.get('username', None)
if username is not None:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
raise exceptions.NotFound(detail="Some message if you want")
else:
return queryset.filter(purchaser=user)
return queryset
你不能只是 return 一个空列表吗?
queryset = queryset.filter(purchaser__username=username)
如果用户名无效,则此查询集将只是一个空查询集,DRF 将 return 结果为一个空列表。