python3-开发进阶Django中序列化以及rest_framework的序列化

一、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"})),]

原文地址:https://www.cnblogs.com/ManyQian/p/9410608.html

时间: 2024-10-17 00:38:53

python3-开发进阶Django中序列化以及rest_framework的序列化的相关文章

python3开发进阶-Django框架学习前的小项目(一个简单的学员管理系统)

''' 自己独立写一个学员管理系统 表结构: 班级表: -id -grade_name 学生表: -id -student_name -grade 关联外键班级表 老师表: -id -teacher_name -grades (多对多 关联班级表) ''' 在写小项目之前我们先复习一下小知识: 1. form表单提交数据的注意事项: 是form不是from,必须要有method和action 所有获取用户输入的表单标签要放在form表单里面,表单标签必须要有name属性 form表单必须要有su

python3开发进阶-Django框架中的ORM的常用操作的补充(F查询和Q查询,事务)

阅读目录 F查询和Q查询 事务 一.F查询和Q查询 1.F查询 查询前的准备 class Product(models.Model): name = models.CharField(max_length=32) price = models.DecimalField(max_digits=10, decimal_places=2) # 库存数 inventory = models.IntegerField() # 卖出数 sale = models.IntegerField() def __s

python3开发进阶-Django框架的自带认证功能auth模块和User对象的基本操作

阅读目录 auth模块 User对象 认证进阶 一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: authenticate()    提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数 如果认证信息有效,会返回一个  User  对象.authenticate()会在User 对象上设置一个属性来标识后端已经认证了该用户,且该信息

python3开发进阶-Django视图(View)的常见用法

阅读目录 简述Django的View(视图) CBV和FBV Request对象和Response对象 Django组件(render,redirect)详解 一.简述Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项目目录下面. 除此之外

python3开发进阶-Django框架的ORM常用字段和参数

阅读目录 常用字段 字段合集 自定义字段 字段参数 关系参数 多对多的关联关系的三种方式 一.常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型,范围在 -2147483648 to 2147483647.  (最大十位) CharField 字符类型,必须提供max_length参数, max_length表示字符长度. DateField 日期字段,

5、第十 - WEB开发进阶 - Django静态文件应用

Web Django 网站通常需要提供其他文件,如图像.JavaScript或CSS.在Django中,我们将这些文件称为"静态文件". Django提供了django.contrib.staticfiles方法来管理. 一.Django中静态文件添加流程 我们先创建一个,存放静态文件目录:static.目录规划存放在在工程项目下,主要存放的文件CSS.JS.图象文件.如图: 模板文件 login.html 如下: <!DOCTYPE html> <html lang

Python全栈开发【Django进阶之序列化】

Django序列化 序列化是将对象状态转换为可保持或传输的格式的过程 反序列化是指将存储在存储媒体中的对象状态装换成对象的过程 例如游戏都有存档的功能.再次开始的时候只需读档即可(这即是一个序列化与反序列的过程) 序列化也可以将一个对象传递到另一个地方的 关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式. 1.serializers 用于序列化QuerySet中的对象 from django.core import serial

Django中视图总结[urls匹配,HttpRequest对象,HttpResponse对象,对象序列化接受及案例]

视图的功能: 接收请求,进行处理,返回应答. 视图返回的内容为: HttpResponse的对象或子对象 render 返回的是HttpResponse的对象 JsonResponse是HttpResponse的子类 HttpResponseRedirect也是HttpResonse的子类 redirect是HttpResponseRedirect的一个简写 总结:所以视图返回的内容一般为:render,redirect,JsonResponse,Httpresponse 定义视图函数分为两步

全网最热Python3入门+进阶 更快上手实际开发

详情请咨询  QQ  709639943 01.Python Flask 构建微电影视频网站 02.Python3 全网最热的Python3入门+进阶 比自学更快上手实际开发 03.Python3.6 强力Django+杀手级Xadmin打造上线标准的在线教育平台 04.python_进阶强化 05.Java秒杀系统方案优化 高性能高并发实战 06.企业级刚需Nginx入门,全面掌握Nginx配置+快速搭建高可用架构 07.快速上手Linux 玩转典型应用 08.全面系统讲解CSS 工作应用+面