第85篇 Vue第六篇 Rest_Framework序列化与反序列化 Serializers

models.py

from django.db import models

# Create your models here.
__all__ = ["Book", "Publisher", "Author"]

class Book(models.Model):
    title = models.CharField(max_length=32)
    CHOICES = ((1, "python"), (2, "linux"), (3, "go"))
    category = models.IntegerField(choices=CHOICES)
    pub_time = models.DateField()
    publisher = models.ForeignKey(to="Publisher")
    authors = models.ManyToManyField(to="Author")

class Publisher(models.Model):
    title = models.CharField(max_length=32)

class Author(models.Model):
    name = models.CharField(max_length=32)

 serializers.py

from rest_framework import serializers
from .models import Book

class PublisherSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    title = serializers.CharField(max_length=32)

class AuthorSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField(max_length=32)

class BookSerializer(serializers.Serializer):
    id = serializers.IntegerField(required=False)
    title = serializers.CharField(max_length=32)
    pub_time = serializers.DateField()
    # CHOICES = ((1, "python"), (2, "linux"), (3, "go"))
    # category = serializers.ChoiceField(choices=CHOICES)
    category = serializers.CharField(source="get_category_display", read_only=True)
    post_category = serializers.IntegerField(write_only=True)

    publisher = PublisherSerializer(read_only=True)
    authors = AuthorSerializer(many=True, read_only=True)

    publisher_id = serializers.IntegerField(write_only=True)
    author_list = serializers.ListField(write_only=True)

    def create(self, validated_data):
        #通过ORM操作给Book表增加数据
        print(validated_data)
        book_obj = Book.objects.create(title=validated_data["title"], pub_time=validated_data["pub_time"],
                            category=validated_data["post_category"], publisher_id=validated_data["publisher_id"])
        book_obj.authors.add(*validated_data["author_list"])
        return book_obj

  urls.py

from django.conf.urls import url, include
from .views import BookView, BooksView, BookEditView

urlpatterns = [
    # url(r‘^list$‘, BookView.as_view()),
    url(r‘^list$‘, BooksView.as_view()),
    url(r‘^retrieve/(?P<id>\d+)$‘, BookEditView.as_view()),
]

  views.py

from django.shortcuts import render
from django.views import View
from django.http import HttpResponse, JsonResponse
from .models import Book, Publisher
from django.core import serializers
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers
from .serializers import BookSerializer
import json
# Create your views here.

# book_list = [
#     {
#         "id": 1,
#         "title": "",
#         "publisher": {
#              "id": 1
#               "title": ""
#           },
#          "authors": [{}]
#     },
#     {
#
#     }
# ]

class BookView(View):
    # 第一版用.values实现序列化
    # def get(self, request):
    #     book_queryset = Book.objects.values("id", "title", "pub_time", "publisher")
    #     # queryset [{}, {}]
    #     book_list = list(book_queryset)
    #     ret = json.dumps(book_list, ensure_ascii=False)
        # return HttpResponse(ret)
    #     ret = []
    #     for book in book_list:
    #         publisher_obj = Publisher.objects.filter(id=book["publisher"]).first()
    #         book["publisher"] = {
    #             "id": publisher_obj.id,
    #             "title": publisher_obj.title
    #         }
    #         ret.append(book)
    #     return JsonResponse(ret, safe=False, json_dumps_params={"ensure_ascii": False})

    # 第二版
    def get(self, request):
        book_queryset = Book.objects.all()
        ret = serializers.serialize("json", book_queryset, ensure_ascii=False)
        return HttpResponse(ret)

class BooksView(APIView):
    def get(self, request):
        # print(request._request)
        book_queryset = Book.objects.all()
        # 声明一个序列化器
        # 用序列化器去序列化queryset
        ser_obj = BookSerializer(book_queryset, many=True)
        return Response(ser_obj.data)

    # 前端 {"id""title",
    #         category: 1
    #           publisher: 1
    #           authors: [1, 2]
    #       }
    def post(self, request):
        # 获取前端传过来的数据
        book_obj = request.data
        # 用序列化器做校验
        ser_obj = BookSerializer(data=book_obj)
        if ser_obj.is_valid():
            ser_obj.save()
            print(ser_obj.validated_data)
            return Response(ser_obj.data)
        return Response(ser_obj.errors)

class BookEditView(APIView):
    def get(self, request, id):
        book_obj = Book.objects.filter(id=id).first()
        pass

    # {"title": "xxxx"}

    def put(self, request, id):
        pass

  

 

APIView跟View区别
-- APIView继承了View
-- scrf的豁免
-- 重新封装了request
旧的request给了request._request
request.query_params 旧的request.GET
request.data 除了GET的所有的信息

序列化组件
-- 序列化
--一定要记得在setting.py 中的app里面加上rest_framework ←这个很重要
-- 声明一个序列化器
class BookSerializer(serializers.Serializer):
id = serializers.IntegerField(required=False)
title = serializers.CharField(max_length=32)
pub_time = serializers.DateField()
-- 视图里序列化我们的queryset
ser_obj = BookSerializer(queryset, many=True)
return Response(ser_obj.data)
-- 实现流程
-- 如果指定了many=True
-- 把queryset当成可迭代对象去循环 得到每个模型对象
-- 把每个模型对象放入序列号器进行序列化
-- 进行字段匹配 匹配上的字段进行序列化 匹配不上丢弃
-- 必须满足序列化的所有字段要求
-- 反序列化
-- 获取前端传过来的数据
-- 用序列化器进行校验
ser_obj = BookSerializer(data=request.data)
if ser_obj.is_valid():
ser_obj.save()# 调用create方法
return Response(ser_obj.data)
else:
return Response(ser_obj.errors)
-- 写create方法
在create方法里用ORM操作创建新对象
-- 序列化以及反序列化的时候字段类型不统一的情况
-- required=False
-- read_only=True
-- write_only=True

原文地址:https://www.cnblogs.com/cavalier-chen/p/10099024.html

时间: 2024-10-17 00:39:16

第85篇 Vue第六篇 Rest_Framework序列化与反序列化 Serializers的相关文章

《你的灯亮着吗》第五篇、第六篇总结

第五篇讲的是问题是从哪儿来的?由一个叫珍妮特去波兰拜访她的祖母在旅途中遇到的麻烦引出主题.一开始她把问题推到“官僚主义”上,她感觉这似乎是最恰当的.但是最后她发现她十分倾向于把整件事归咎于“官僚主义”,之后她提出了一个至关重要的问题:问题是从哪儿来的?从这点出发,她成功找到乐各种备选答案.后来,珍妮特想这个问题的根源也许是她自己.她开始以正常的心态面对曾被她称作灰脸先生的人,他们顺利的交谈,最后事情的到了解决.一切都正常的进行着,一旦你确定问题真正从哪来,尤其是因为问题的根源常常在你自己身上.

rest_framework序列化,反序列化

序列化组件 from rest_framework.response import Response1.Response本质也是继承了httpresponse,比httpResponse还强大,传入一个字典,列表可以序列化2.会根据不同的请求客户端,返回不同的东西,如果是浏览器访问的话就返回一个页面,如果是手机端的话就返回数据 from django.db import models # Create your models here. class Book(models.Model): nid

python基础篇【第六篇】模块补充、正则表达式

上一篇已经讲述了什么是模块,下面我们再一起认识一些python中常用的模块. 一.os模块 前面也有用到过os模块,但那都是小儿科,os模块在日后的python撸码中将一直会伴随着你! python编程时,经常和文件.目录打交道,这是就离不了os模块.os模块包含普遍的操作系统功能,与具体的平台无关. 要想使用模块,需先导入模块   如:import os     导入模块 1. os.name()——判断现在正在实用的平台,Windows 返回 ‘nt'; Linux 返回’posix' 1

【屌丝程序的口才逆袭演讲稿50篇】第六篇:两个年轻人挣钱的故事 【张振华.Jack】

骐骥一跃,不能十步.驽马十驾,功在不舍.让我们一起来见证坚持的力量.不知道自己能坚持多久,但我相信坚持就是力量.Java高端交流群:240619787: 演讲稿主题:<两个年轻人挣钱的故事> 我想问一下大家如果要挣更多的钱是不是平时要加班,周六日还是要加班呢?同意这一点的请举手(自己同时举手),好的谢谢.而今天我要分享一个两个年轻人挣钱的故事. 有这样两个(手势二)年轻人,一个壮的,一个瘦的.同时得到一个工作就是,穿过山谷,把山上的泉水运到村里来.刚开始两个人都很兴奋,都很努力工作,每天他们从

《你的灯亮着吗》阅读笔记之第五篇与第六篇

问题是从哪里来的,这个问题尤其在我们临近期末考试的时候尤其明显,我们会考虑老师出的考试题目是从哪里老的,会是和哪个章节哪个知识点有关系,我们会去猜测老师出的重点的地方,这样我们就会侧重的去准备考试,当然最后期望获得一个好的成绩. 当然在解决别的问题时候,我们是不是也想过问题是从哪里来的呢? 汤姆面对老板的要求,想获得一个解决方案,但是我们在书中看到,汤姆提出来的想法,老板们都已经知道了,但是为什么还让汤姆来解决这个最低成本的问题呢?老板们真的想解决这个问题吗?在我看来未必.面对不想解决的问题即使

Python基础篇【第六篇】:函数补充

三元运算 三元运算(三目运算),是简单的条件的语句缩写. Python没有三目运算符但是可以用if else语句实现相同的功能: #!/usr/bin/env python3 #三元运算格式 #result = 值1 if 条件 else 值2 #如果条件成立,那么值1赋值给变量result,否则将值2赋给result变量 #实例: result = True if 1 > 0 else False print(result) #运行结果 True lambda表达式 通过三元运算可以很快完成简

iOS开发网络篇—文件下载(六&#183;压缩和解压)

iOS开发网络篇—文件下载(六·压缩和解压) 一.完成文件下载 需求:完成文件下载 1.在本地服务器中,添加一个图片的压缩文件. 2.代码示例: 文件下载器代码: 头文件 1 // 2 // YYfileDownloader.h 3 // 01-文件的下载(不合理) 4 // 5 // Created by apple on 14-7-1. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import <Founda

ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套

这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 ElasticSearch入门 第三篇:索引 ElasticSearch入门 第四篇:使用C#添加和更新文档 ElasticSearch入门 第五篇:使用C#查询文档 ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套 在ElasticSearch中,使用JSON结构来存储数据,

Python之路【第十六篇】:Django【基础篇】

Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 基本配置 一.创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: python manage.py runserver