rest_framework视图组件、路由自动生成及action装饰器
一、视图层
2个视图基类
复制代码
第一层:使用APIView写5个接口
复制代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from .models import Book
from .serializer import BookSerializer
from rest_framework.response import Response
class BookView(APIView):
def get(self,request):
book_list=Book.objects.all()
ser=BookSerializer(instance=book_list,many=True)
print(type(ser))
return Response(ser.data)
def post(self,request):
ser=BookSerializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code':'100','msg':'创建成功'})
else:
return Response({'code': '101', 'msg': '创建失败','err':ser.errors})
class BookDetailView(APIView):
def get(self,request,*args,**kwargs):
book=Book.objects.filter(pk=kwargs['pk']).first()
ser=BookSerializer(instance=book)
print(type(ser))
return Response(ser.data)
def put(self,request,*args,**kwargs):
book=Book.objects.filter(pk=kwargs['pk']).first()
ser=BookSerializer(instance=book,data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': '100', 'msg': '创建成功'})
else:
return Response({'code': '101', 'msg': '创建失败', 'err': ser.errors})
第二层:继承GenericAPIView写5个接口
复制代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
"""
-两个重要的类属性:
queryset = Book.objects.all() # 要序列化的数据
serializer_class = BookSerializer # 序列化类
-几个重要的方法:
self.get_object()
self.get_queryset()
self.get_serializer(instance=book_list, many=True)
"""
class BookView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request):
book_list = self.get_queryset()
ser = self.get_serializer(instance=book_list, many=True)
print(type(ser))
return Response(ser.data)
def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': '100', 'msg': '创建成功'})
else:
return Response({'code': '101', 'msg': '创建失败', 'err': ser.errors})
class BookDetailView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request, *args, **kwargs):
book = self.get_object()
ser = self.get_serializer(instance=book)
print(type(ser))
return Response(ser.data)
def put(self, request, *args, **kwargs):
book = self.get_object()
ser = self.get_serializer(instance=book, data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': '100', 'msg': '创建成功'})
else:
return Response({'code': '101', 'msg': '创建失败', 'err': ser.errors})
第三层:继承GenericAPIView+5个视图扩展类实现5个接口
5 个视图扩展类
复制代码
ListModelMixin,
CreateModelMixin,
RetrieveModelMixin,
UpdateModelMixin,
DestroyModelMixin
复制代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
from rest_framework.mixins import ListModelMixin,CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
class BookView(GenericAPIView,ListModelMixin,CreateModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self,request):
print('获取所有')
return super().list(request)
def post(self, request):
return super().create(request)
class BookDetailView(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request, *args, **kwargs):
print('获取一')
return super().retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return super().update(request, *args, **kwargs)
def delete(self,request, *args, **kwargs):
return super().destroy(request, *args, **kwargs)
第四层:9个视图子类
复制代码
由5个视图拓展类而来
ListAPIView,CreateAPIView,ListCreateAPIView
RetrieveAPIView,UpdateAPIView,DestroyAPIView
RetrieveUpdateDestroyAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView
复制代码
from rest_framework.generics import ListAPIView,CreateAPIView,ListCreateAPIView
from rest_framework.generics import RetrieveAPIView,UpdateAPIView,DestroyAPIView
from rest_framework.generics import RetrieveUpdateDestroyAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView
class BookView(ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
class BookDetailView(RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
第五层:视图集
复制代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
ModelViewSet=
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet
-ViewSetMixin+GenericAPIView
class ViewSetMixin:
@classonlymethod
def as_view(cls, actions=None, **initkwargs):
def view(request, *args, **kwargs):
for method, action in actions.items():
handler = getattr(self, action)
setattr(self, method, handler)
return self.dispatch(request, *args, **kwargs)
return csrf_exempt(view)
视图集中的类
复制代码
-ModelViewSet
-ReadOnlyModelViewSet
-ViewSetMixin
-ViewSet :ViewSetMixin+APIView
-GenericViewSet:ViewSetMixin+GenericAPIView
使用视图集写5个接口+修改路由格式
复制代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet,ViewSetMixin,GenericViewSet,ViewSet
"""
path('books/',BookView.as_view({'get':'list','post':'create',})),
path('books/<int:pk>',BookView.as_view({'get':'retrieve','put':'update','delete':'destroy'})),
"""
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
"""
path('books/',BookView.as_view({'get':'list'})),
path('books/<int:pk>',BookView.as_view({'get':'retrieve'})),
"""
class BookView(ReadOnlyModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
from rest_framework.decorators import action
class BookView(ViewSet):
@action(methods=['post','get'],detail=False,url_path='as')
def lvchenxi(self,request):
print('大狗子')
return Response({})
'''
action关键参数:
methods:请求方式
detail:
False:是不是带id的路由 http://127.0.0.1/publish/3 http://127.0.0.1/publish
True: 生成的路由publish/pk/lqz/
url_path:如果不写,就是函数名生成的路径是:http://127.0.0.1/publish/lqz
url_name:别名
'''
二、路由层
1、路由组件
复制代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
-写法一:path('publish', views.PublishView.as_view({'get': 'lqz','post':'login'})),
-写法二:自动生成
from rest_framework.routers import SimpleRouter, DefaultRouter
router=SimpleRouter()
router.register('books', views.BookView, 'books')
router.register('publish', views.BookView, 'publish')
path('', include(router.urls)),
-之前自动生成路由只能生成
{'get': 'list', 'post': 'create'},{'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}
-使用action装饰器来做对应关系
'''
methods:请求方式
detail:
False:是不是带id的路由 http://127.0.0.1/publish/3 http://127.0.0.1/publish
True: 生成的路由publish/pk/lqz/
url_path:如果不写,就是函数名生成的路径是:http://127.0.0.1/publish/lqz
url_name:别名
'''
2、 自己写路由,指定映射关系
复制代码
path('publish', views.PublishView.as_view({'get': 'lqz','post':'login'})),
3、只要继承了ViewSetMixin,路由写法就变了,需要映射关系
复制代码
class PublishView(ViewSetMixin,APIView):
def lqz(self,request):
return Response('lqz')
def login(self,request):
return Response('login')

补充
复制代码
1
2 序列化的时候,如果传了many=True,生成的序列化类对的对象是ListSerializer的对象
3 assert 断言 本质就是if+抛异常
a = 11
assert a == 10, ('a必须是10,不然不能往后走')
print(a)
4 列表可以相加
posted @
2022-06-17 22:11
马氵寿
阅读(
193)
评论()
编辑
收藏
举报
点击右上角即可分享
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步