python3-开发进阶Django中序列化以及rest_framew…
2018-08-03 07:36:33来源:博客园 阅读 ()
一、django框架的序列化
直接上代码
1、这是app下的models.py
from django.db import models # Create your models here. class Course(models.Model): title=models.CharField(max_length=32)
2、这是app下的view.py,两种序列化方法
from django.views import View from app01.models import Course class CourseView(View): def get(self,request): ret=Course.objects.all() #这是我们自己用json模块去序列化数据 #import json #temp=[] # for i in ret: # temp.append({ # "title":i.title # }) #这是django自带的 from django.core.serializers import serialize ret=serialize("json",ret) # return HttpResponse(temp) return HttpResponse(ret)
总结:
我们会发现序列化出来的数据比较单一,返回来的样式太麻烦,而django自带的方法,而且无法反序列化!
二、rest_framework中的序列化组件
首先我们要先下载这个模块
pip3 install djangorestframework
装好之后,不要忘了在app中注册rest_framework,
from rest_framework.views import APIView from rest_framework.response import Response from .models import * from django.shortcuts import HttpResponsefrom rest_framework import serializers class BookSerializers(serializers.Serializer): title=serializers.CharField(max_length=32) price=serializers.IntegerField() pub_date=serializers.DateField() publish=serializers.CharField(source="publish.name") #authors=serializers.CharField(source="authors.all") authors=serializers.SerializerMethodField() def get_authors(self,obj): temp=[] for author in obj.authors.all(): data=[]
data.append(author.pk)
data.append(author.name)
temp.append(data) return temp class BookViewSet(APIView): def get(self,request,*args,**kwargs): book_list=Book.objects.all() bs=BookSerializers(book_list,many=True) return Response(bs.data)
我们这里有更简便的方法:
from rest_framework import serializers from app01.models import Book class BookSerializers(serializers.ModelSerializer): class Meta: model=Book fields="__all__"
五种状态的标准形式
class BookView(APIView): def get(self, request): book_list = Book.objects.all() bs = BookSerializers(book_list, many=True) # 序列化数据 return Response(bs.data) def post(self, request): # 添加一条数据 print(request.data) bs=BookSerializers(data=request.data) if bs.is_valid(): bs.save() # 生成记录 return Response(bs.data) else: return Response(bs.errors) class BookDetailView(APIView): def get(self,request,pk): book_obj=Book.objects.filter(pk=pk).first() bs=BookSerializers(book_obj,many=False) return Response(bs.data) def put(self,request,pk): book_obj = Book.objects.filter(pk=pk).first() bs=BookSerializers(data=request.data,instance=book_obj)#instance if bs.is_valid(): bs.save() # update return Response(bs.data) else: return Response(bs.errors) def delete(self,request,pk): Book.objects.filter(pk=pk).delete() return Response("")
我们再创建一张表,我们会发现代码有点冗余了,除了变量名的变化,这里也有封好的方法mixin类
from rest_framework import mixins from rest_framework import generics class BookViewSet(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView): queryset = Book.objects.all() serializer_class = BookSerializers def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs) class BookDetailViewSet(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView): queryset = Book.objects.all() serializer_class = BookSerializers def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)
我们在上面的几个类中,我们下来翻看源码:
from rest_framework.mixins import CreateModelMixin from rest_framework.mixins import ListModelMixin from rest_framework.mixins import DestroyModelMixin from rest_framework.mixins import RetrieveModelMixin from rest_framework.mixins import UpdateModelMixin
我们先来看CreateModeMixin类的源码,我们发现 create
ListModeMixin类的源码,我们发现list
RetrieveModelMixin类的源码,我们发现retrieve
UpdateModelMixin类的源码,我们发现update
DestroyModelMixin类的源码,我们发现destroy
然后我们可以这样封装:
from rest_framework.mixins import CreateModelMixin,ListModelMixin,DestroyModelMixin,RetrieveModelMixin,UpdateModelMixin from rest_framework import generics class BookView(CreateModelMixin,ListModelMixin,generics.GenericAPIView,): queryset=Book.objects.all() serializer_class=BookSerializers def get(self,request): return self.list(request) def post(self,request): return self.create(request) class BookDetailView(DestroyModelMixin,UpdateModelMixin,RetrieveModelMixin,generics.GenericAPIView,): queryset = Book.objects.all() serializer_class = BookSerializers def get(self,request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) def put(self,request, *args, **kwargs): return self.update(request, *args, **kwargs) def delete(self,request, *args, **kwargs): return self.destroy(request, *args, **kwargs)
发现代码还是冗余的,我们还有更简便的方法,REST框架提供了简化的view.py模块
from rest_framework import mixins from rest_framework import generics class BookViewSet(generics.ListCreateAPIView): queryset = Book.objects.all() serializer_class = BookSerializers class BookDetailViewSet(generics.RetrieveUpdateDestroyAPIView): queryset = Book.objects.all() serializer_class = BookSerializers class PublishViewSet(generics.ListCreateAPIView): queryset = Publish.objects.all() serializer_class = PublshSerializers class PublishDetailViewSet(generics.RetrieveUpdateDestroyAPIView): queryset = Publish.objects.all() serializer_class = PublshSerializers
需要什么样的方法,就继承什么方法类,但里面的方法需要在url传入需要的参数
#views中代码非常简介,最重要的还是urls from rest_framework.viewsets import ModelViewSet class AuthorModelView(ModelViewSet): queryset=Author.objects.all() serializer_class=AuthorSerializers
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), #在as_view中加入参数 url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"})), url(r'^authors/(?P<pk>\d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"})),
]
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:课时15:字符串:格式化
- python 之 前端开发(form标签、单选框、多选框、file上传文 2019-08-13
- python 之 前端开发(HTTP协议、head标签、img标签、a标签、 2019-08-13
- 开发工具--PyCharm 2019-07-24
- Python进阶:程序界的垃圾分类回收 2019-07-24
- 福利分享:个人整理的Python书单,从基础到进阶 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash