您的位置:首页 > 编程语言 > Go语言

django-restframework之mixins视图组件

2019-08-21 20:32 951 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_45154837/article/details/99993381

上几篇博客我讲解了关于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组件的一些简单的增删改查的使用
后面会有更多的只是与大家分享

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: