Как правильно вернуть ошибку при переопределении .get_queryset ()? - PullRequest
0 голосов
/ 13 февраля 2019

Я прочитал в документе DRF, что вы можете отфильтровать параметры запроса, переопределив .get_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 = Purchase.objects.all()
        username = self.request.query_params.get('username', None)
        if username is not None:
            queryset = queryset.filter(purchaser__username=username)
        return queryset

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 06 августа 2019

Если ваш 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')
0 голосов
/ 13 февраля 2019

Вы можете сделать это

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)
...