1. 程式人生 > 其它 >DRF過濾 排序 異常處理 封裝Response

DRF過濾 排序 異常處理 封裝Response

過濾

# 1 安裝 pip install django-filter
# 2 註冊,在app中註冊
# 3 全域性配,或者全域性配
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),
# 4 檢視類:
class BookView(ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_fields = ('name',)  # 配置可以按照哪個欄位來過濾

排序

# 區域性使用和全域性使用
# 區域性使用
from rest_framework.filters import OrderingFilter
class BookView2(ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [OrderingFilter]
    ordering_fields = ('id', 'price')  # 注意要配置
# urls.py:
path('books2/', views.BookView2.as_view()),
# 使用: http://127.0.0.1:8000/books2/?ordering=-price http://127.0.0.1:8000/books2/?ordering=price

異常處理

# 統一介面返回

# 自定義異常方法,替換掉全域性
from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework import status


def my_exception_handler(exc, context):
    response = exception_handler(exc, context)
    
# 兩種情況,一個是None,drf沒有處理 # response物件,django處理了,但是處理的不符合咱們的要求 if not response: if isinstance(exc, ZeroDivisionError): return Response(data={'status': 777, 'msg': '除以0的錯誤' + str(exc)}, status=status.HTTP_400_BAD_REQUEST) return Response(data={'status': 999, 'msg': str(exc)}, status=status.HTTP_400_BAD_REQUEST) else: # return response return Response(data={'status': 888, 'msg': response.data.get('detail')}, status=status.HTTP_400_BAD_REQUEST) # 全域性配置settings.py 'EXCEPTION_HANDLER': 'app01.app_auth.my_exception_handler',

封裝Response物件

# 以後都用自己封裝Response物件  app_auth.py
from rest_framework.response import Response

class APIResponse(Response):
    def __init__(self, code=100, msg='成功', data=None, status=None, headers=None,**kwargs ):
        dic = {'code': code, 'msg': msg}

        if data:
            dic = {'code': code, 'msg': msg, 'data': data}
        dic.update(kwargs)
        super().__init__(data=dic, status=status, headers=headers)
        
# views.py: 使用
# 自定義返回物件
from app01.app_auth import APIResponse

class TestView7(APIView):
    def get(self, request, *args, **kwargs):
        return APIResponse(data={'name': 'lqz'}, token='argargaedasads')