django-restframework之mixins视图组件
上几篇博客我讲解了关于APIView的用法
虽然说APIView能满足编写接口的需求,但是不够简洁
当我们要编写几个、十几个,甚至几十个接口的时候,就会出现大量的
代码重复,这明显不符合python的简洁的代码风格,于是,
帮助优化、简化APIView代码逻辑的视图组件就出现了
首先先来认识一下这些视图组件:
1.ListModelMixin GET http://127.0.0.1:8000/api/books/
2.CreateModelMixin POST http://127.0.0.1:8000/api/books/
3.RetrieveModelMixin GET http://127.0.0.1:8000/api/books/10/
4.UpdateModelMixin PUT http://127.0.0.1:8000/api/books/10/
5.DestoryModelMixin DELETE http://127.0.0.1:8000/api/books/10/
前面是组件名称,后面是这些组件对应的一些请求方式以及路径案例
下面是代码:
获取全部数据 与 新增数据的视图
class BookView(ListModelMixin,CreateModelMixin,GenericAPIView): queryset = Book.objects.all() serializer_class = BookSerialize def get(self,request,*args,**kwargs): return self.list(request) def post(self,request,*args,**kwargs): return self.create(request)
获取一条数据 , 更新数据 , 删除数据的视图:
class BookFilterView(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView): queryset = Book.objects.all() serializer_class = BookSerialize def get(self,request,*args,**kwargs): return self.retrieve(request) def put(self,request,*args,**kwargs): return self.update(request) def delete(self,request,*args,**kwargs): return self.destroy(request)
视图中的这一句return self.list(request)
就相当于APIView中
data = BookSerialize(queryset,many=True)
return Response(data.data)
等一些增删改查的逻辑
看看源码:
class ListModelMixin: """ List a queryset. """ def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data)
其实就是封装了一些逻辑代码而已
序列化类:
class BookSerialize(serializers.Serializer): title = serializers.CharField(max_length=32) price = serializers.IntegerField() publish = serializers.CharField() publish_time = serializers.CharField(max_length=32,read_only=True,source='publish.time') publish_count = serializers.CharField(max_length=32,read_only=True,source='publish.count') author = serializers.SerializerMethodField() def get_author(self,book_obj): author_list = list() for author in book_obj.author.all(): author_list.append(author.name) return author_list def create(self, validated_data): print(validated_data) title = validated_data['title'] price = validated_data['price'] publish = validated_data['publish'] publish = Publish.objects.create(company=publish) book = Book.objects.create( title=title, price=price, publish=publish ) return book def update(self, instance, validated_data): print(validated_data) title = validated_data['title'] price = validated_data['price'] publish_name = validated_data['publish'] publish = Publish.objects.create(company=publish_name) instance.title = title instance.price = price instance.publish = publish instance.save() return instance
urls:
url(r'books/$',views.BookView.as_view(),name="books"), url(r'books/(?P<pk>\d+)/$',views.BookFilterView.as_view(),name="books_filter"),
第二个url中的参数一定要是pk,在封装的时候指定好了
好了,这就是mixins组件的一些简单的增删改查的使用
后面会有更多的只是与大家分享
- django-rest-framework笔记-类视图篇
- Django的REST framework框架视图中自定义方法的路由问题
- Django的REST framework框架视图中自动生成路由
- django rest framework mixins小结
- Django 之REST framework学习6:视图集合类和路由器(ViewSets & Routers)
- Django之REST_framework 框架基本组件使用
- DRF(Django rest_framework)中主要的类视图
- Django REST framework JWT认证方式和BasicAuthentication认证方式实现认证用户与未认证用户访问同一视图类并得到不同的功能
- django-rest-framework指南(3):Class Based Views(类视图)
- django-rest-framework之基于类的视图
- 深入解析当下大热的前后端分离组件django-rest_framework系列
- django-rest-framework视图层的使用(二)
- python-django rest framework框架之视图
- django restframework 序列化
- Django REST framework JWT
- Django序列化神器插件rest-framework
- Django学习笔记(13)——Django的用户认证组件,视图层和QuerySet API
- Django REST framework(官方教程-六)
- django restframework serializer 增加自定义字段
- django rest framework serializers小结