【问题标题】:How to properly return error when overriding .get_queryset()?覆盖.get_queryset()时如何正确返回错误?
【发布时间】:2019-07-07 02:35:44
【问题描述】:

我在 DRF 文档上读到,您可以通过覆盖 .get_queryset() 来过滤查询参数。我正在寻找最佳实践,返回什么,以防过滤器不正确以及在哪里返回错误消息。

我提到的文档是here 我在下面包含源代码

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

感谢您的帮助

【问题讨论】:

  • 如果密钥不正确,不返回错误并忽略。如果您担心它会返回太多内容,请使用分页。

标签: django-rest-framework django-rest-viewsets


【解决方案1】:

如果您的 API 是严格的,并且您需要发送一些关于坏过滤器的消息,您可以引发错误,以便 DRF 知道如何处理它 (docs) 例如:

from rest_framework.exceptions import ValidationError

class PurchaseList(generics.ListAPIView):
    serializer_class = PurchaseSerializer

    def get_queryset(self):
      ...
      if error:
        raise ValidationError(detail='Invalid Params')

【讨论】:

    【解决方案2】:

    你可以这样做

    from rest_framework import status
    
    class PurchaseList(generics.ListAPIView):
        serializer_class = PurchaseSerializer
        def get_queryset(self):
            try:
                """
                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
            except:
                return None
    
        def get(self, request):
            try:
               data=view_serializer(self.get_queryset(),many=True).data
               context = {
                   "data" : data,
                   "message" : "Contents returned successfully",
                   "success" : True
                   }
               return Response(context, status=status.HTTP_200_OK)
            except Exception as error:
               context = {'error': str(error), 'success': "false", 'message': 'Failed To Get contents.'}
               return Response(context, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    

    【讨论】:

    • 感谢您的回答。但是返回 400 throw server 错误。
    • 你能把错误发给我吗?或者显示它的截图?
    • 它返回The response content must be rendered before it can be iterated over. 搜索后我找到了我的问题的答案here
    • 我已经更新了答案。现在它是正确的。您可以将其标记为正确,以便其他人发现它有帮助。感谢您指出我们无法在 get_queryset() 中返回 Response
    猜你喜欢
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 2020-05-29
    • 2015-11-17
    • 2013-05-03
    • 2020-10-07
    • 2020-05-03
    • 2015-11-29
    相关资源
    最近更新 更多