python3-开发进阶Django中序列化以及rest_framework的序列化
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python3-开发进阶Django中序列化以及rest_framework的序列化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5976字,纯文字阅读大概需要9分钟。
内容图文
一、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() # updatereturn 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"})),
]
原文:https://www.cnblogs.com/ManyQian/p/9410608.html
内容总结
以上是互联网集市为您收集整理的python3-开发进阶Django中序列化以及rest_framework的序列化全部内容,希望文章能够帮你解决python3-开发进阶Django中序列化以及rest_framework的序列化所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。