Django REST framework 序列化

创建一个序列化类

使用序列化有四种方式

  • 使用json模块,完全手写
  • 使用django自带的序列化模块 1,# from django.core import serializers   2,# data=serializers.serialize(“json”,book_list)
  • 使用REST framework 带的序列化方法,但是自己写规则  BookSerializers(serializers.Serializer)
  • 使用REST framework 带的序列化方法,不自定义,完全使用模块 BookSerializers(serializers.ModelSerializer)

开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。

models部分:

from django.db import models# Create your models here.
class Book(models.Model):title=models.CharField(max_length=32)price=models.IntegerField()pub_date=models.DateField()publish=models.ForeignKey("Publish")authors=models.ManyToManyField("Author")def __str__(self):return self.titleclass Publish(models.Model):name=models.CharField(max_length=32)email=models.EmailField()def __str__(self):return self.nameclass Author(models.Model):name=models.CharField(max_length=32)age=models.IntegerField()def __str__(self):return self.name

views部分:

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from django.shortcuts import HttpResponse
from django.core import serializers
from 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")  # 一对多,序列化时如果想要指定字段,需要使用参数source,跨表用.#authors=serializers.CharField(source="authors.all")authors=serializers.SerializerMethodField()           # 多对多时,自定义字段字段def get_authors(self,obj):   # 名字固定写法 get_*temp=[]for author in obj.authors.all():temp.append(author.name)return tempclass Meta:model=Book fields=['title','price','pub_date','authors']# 钩子函数def validate_title(self, value):if '草' in value:raise ValidationError('不符合社会主义核心价值观')return valueclass BookViewSet(APIView):def get(self,request,*args,**kwargs):book_list=Book.objects.all()# 序列化方式1 自己手写json:# from django.forms.models import model_to_dict# import json# data=[]# for obj in book_list:#     data.append(model_to_dict(obj))# print(data)# return HttpResponse("ok")# 序列化方式2,使用django自带的序列化模块:# from django.core import serializers# data=serializers.serialize("json",book_list)# return HttpResponse(data)# 序列化方式3,使用REST framework 带的序列化方法,但是自己写规则:bs=BookSerializers(book_list,many=True)return Response(bs.data)# 序列化方式4,使用REST framework 带的序列化方法,不自定义,完全使用模块,如下

ModelSerializer

# ModelSerializer 继承自 Serializer
class BookSerializers(serializers.ModelSerializer):       # 不自定义,完全使用模块class Meta:model=Bookfields="__all__"depth=1  # 表的深度,即使用一对多,多对多时,跨表的深度extra_kwargs = {"tag": {"error_messages": {"does_not_exist": '"{pk_value}"对应的tag对象不存在。'}}}

在视图中使用序列化类

提交post(添加)请求

def post(self,request,*args,**kwargs):bs=BookSerializers(data=request.data,many=False)  # 实例化 ,many=false 是实例一个对象,many=true 是实例化quersetif bs.is_valid():# print(bs.validated_data)bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)

单条数据的get(查询一条)和put(更新一条)请求

class BookDetailViewSet(APIView):def get(self,request,pk):book_obj=Book.objects.filter(pk=pk).first()bs=BookSerializers(book_obj)return Response(bs.data)def put(self,request,pk):book_obj=Book.objects.filter(pk=pk).first()bs=BookSerializers(book_obj,data=request.data) # 有data参数,调用save是更新操作if bs.is_valid():bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)

重写save中的create方法

重写create方法,当你要对某一个字段进行操作的时候,不能用父类的create方法,source不能被解析出来

class BookSerializers(serializers.ModelSerializer):class Meta:model=Bookfields="__all__"# exclude = ['authors',]# depth=1def create(self, validated_data):authors = validated_data.pop('authors')obj = Book.objects.create(**validated_data)obj.authors.add(*authors)return obj

自定义验证

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers
from .. import modelsclass PasswordValidator(object):def __init__(self, base):self.base = str(base)def __call__(self, value):if value != self.base:message = 'This field must be %s.' % self.baseraise serializers.ValidationError(message)def set_context(self, serializer_field):# 执行验证之前调用,serializer_fields是当前字段对象passclass ModelUserSerializer(serializers.ModelSerializer):user = serializers.CharField(max_length=32)class Meta:model = models.UserInfofields = "__all__"# fields = ['user', 'pwd', 'ut']depth = 2extra_kwargs = {'user': {'min_length': 6},'pwd': {'validators': [PasswordValidator(666), ]}}# read_only_fields = ['user']

超链接API:Hyperlinked

class BookSerializers(serializers.ModelSerializer):publish= serializers.HyperlinkedIdentityField(view_name='publish_detail', # 反向解析lookup_field="publish_id",  # 这里是取这个id值,当你循环到那个外键的那个id值的值的时候,作为参数传进去lookup_url_kwarg="pk")      # 把还是那个面的id作为参数传进去,就是在url路由里面的有名分组class Meta:model=Bookfields="__all__"#depth=1

urls部分:

urlpatterns = [url(r'^books/$', views.BookViewSet.as_view(),name="book_list"),    # 需要加name参数url(r'^books/(?P<pk>\d+)$', views.BookDetailViewSet.as_view(),name="book_detail"),url(r'^publishers/$', views.PublishViewSet.as_view(),name="publish_list"),url(r'^publishers/(?P<pk>\d+)$', views.PublishDetailViewSet.as_view(),name="publish_detail"),
]

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SIMD的AVS整数反变换算法设计与优化

基于SIMD 的AVS 整数反变换算法设计与优化王玲娟&#xff0c;张刚**作者简介&#xff1a;王玲娟&#xff0c;&#xff08;1987-&#xff09;&#xff0c;女&#xff0c;在读硕士&#xff0c;主要研究方向&#xff1a;视频解码算法通信联系人&#xff1a;张刚&#xff0c;&#…

Word -- 列表重新编号

Word -- 列表重新编号office一言&#xff1a;我小心翼翼地灌溉&#xff0c;一日复一日地期待&#xff0c;那么费力&#xff0c;植成参天的乔木&#xff0c;岂愿见你终有一日从容赴死&#xff1f;问题 word 文档早就想解决的一个问题&#xff0c;这次遇到了就上网找解决掉了&…

非持久连接和持久连接

非持久连接和持久连接 HTTP既可以使用非持久连接(nonpersistent connection)&#xff0c;也可以使用持久连接(persistent connection)。HTTP/1.0使用非持久连接&#xff0c;HTTP/1.1默认使用持久连接。 非持久连接 让我们查看一下非持久连接情况下从服务器到客户传送一个Web页面…

计算机开机键鼠无法识别,我得电脑一开机就检测不到键盘和鼠标

2005-10-18 16:06:131、开机后当出现dos界面时&#xff0c;按一下pause键(这个键在四个方向键的上边&#xff0c;仔细找就能找到)&#xff0c;如果计算机启动停止&#xff0c;说明你的键盘起作用&#xff0c;主板在开机时就已经检测到了鼠标键盘。启动后不能使用鼠标键盘&#…

vs2003 局部友元访问私有不可访问_C++ 类:重载运算符与友元

18.类中重载运算符与友元上次节中学习了如何在类中重新定义赋值()运算符&#xff0c;实际上在一个自定义类中除了赋值()运算符外&#xff0c;类的对象是不可以直接使用运算符的&#xff0c;比如你在main函数中写这样的代码会报错&#xff1a;如果想解决这些报错问题&#xff0c…

oracle sqlldr (一) 最基本语法

-- Create table create table DEPT2 (DEPTNO NUMBER(2) not null,DNAME VARCHAR2(14),LOC VARCHAR2(1000) ); alter table DEPT2add constraint DEPT_PK primary key (DEPTNO);------demo.ctl LOAD DATA INFILE * --数据在控制文件中 INTO TABLE DEPT2 INSERT ---默认加…

Django REST framework 视图

上一部分代码在序列化部分 类继承顺序 ############### mixins.py ################ # 类中调用的方法均在 GenericAPIView 类中实现&#xff0c;所以下列类需要结合 GenericAPIView 使用 class ListModelMixin(object) # 查看继承类def list(self, reque…

AVS软件解码器的优化

AVS软件解码器的优化 董斌 , 姜昱明 (西安 电子科技大学计算机学院,陕西 西安,710071)) 摘 要: 主要研究了AVS标准的视频压缩部分,指出了影响解码速度的瓶颈并提出了一种优化方案.使用从程序结构入手结合使用SIMD指令集的方案来优化AVS软件解码器.实验结果表明优化方案可行并且…

IOS7.1.1真的像网上流传的那么好?没有任何问题么??

IOS7.1.1推送更新之后到处看到网上说711好的~~ 那么IOS7.1.1真的像网上现在流传的那么好么&#xff1f; 其实不然&#xff0c;IOS7.1.1目前众多网友反映说升级ios7.1.1之后APPstore连接不上了&#xff0c;提示无法连接到APPstore。 这个问题也不难解决~还是之前的老办法~ 那么今…

三校生计算机对口本科有哪些学校,宝山三校生五月对口高考报名

多次复习生活不可能像你想象得那么好&#xff0c;但也不会像你想象得那么糟。我觉得人的脆弱和坚强都超乎自己的想象。多种方式结合起来复习单一的复习方法&#xff0c;易产生消极情绪和疲劳&#xff0c;如果采用交谈复习法、讨论复习法、自我检查复习法多样化的复习方法&#…

localhost 已拒绝连接_【Python】MongoDB数据库的连接和操作

安装Python 要连接 MongoDB 需要 MongoDB 驱动。pip安装&#xff1a;python3 -m pip3 install pymongo创建数据库import pymongo myclient pymongo.MongoClient("mongodb://localhost:27017/")mydb myclient["loaderman"]注意: 在 MongoDB 中&#xff0c…

checkbox已设置为checked--true-但不勾选问题解决方法(只第一次勾选有效)

一、出现的问题及解决方法&#xff1a; 今天在写一个table相关插件的时候无意中发现了这样一个问题&#xff0c;记得以前在写这种控制checkbox选中与非选中的代码时并没有这种bug&#xff0c;当时也是用的checked属性&#xff0c;而现在却行不通了。 于是乎做了以下测试&#x…

Python 错误和异常小结[转]

原文链接 http://blog.csdn.net/sinchb/article/details/8392827 事先说明哦&#xff0c;这不是一篇关于Python异常的全面介绍的文章&#xff0c;这只是在学习Python异常后的一篇笔记式的记录和小结性质的文章。什么&#xff1f;你还不知道什么是异常&#xff0c;额... 1.Py…

Django REST framework 认证、权限和频率组件

认证与权限频率组件 身份验证是将传入请求与一组标识凭据&#xff08;例如请求来自的用户或其签名的令牌&#xff09;相关联的机制。然后 权限 和 限制 组件决定是否拒绝这个请求。 简单来说就是&#xff1a; 认证确定了你是谁权限确定你能不能访问某个接口限制确定你访问某…

高速率AVS整数变换的汇编实现与优化

1 引言 AVS标准Ⅲ采用的8x8整数变换在获得较H&#xff0e;264更高的压缩率和主观图像质量的同时&#xff0c;增加了算法的实现复杂性和时间开销。本文重点研究AVS编解码器的整数变换模块&#xff0c;针对不同的算法实现模式&#xff0c;在原有Visual C6&#xff0e;0整数变换模…

计算机与广播电视论文,浅谈广播电视中计算机技术的作用论文.pdf

1、计算机技术在广播电视的媒体内容中有重要应用在以往的广播电视中&#xff0c; 媒体内容主要分为音频和视频两种信号&#xff0c; 在传输的过程中使用的是模拟信号&#xff0c; 但模拟信号受到的外界干扰因素较为明显&#xff0c; 因此广播电视传播的媒体内容受到影响&#x…

opencv安装教程python3.7_Mac下安装使用Python-OpenCV,解决opencv3安装完成无法使用的问题 - pytorch中文网...

OpenCV是一个跨平台计算机视觉库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。提供了Python、Ruby、MATLAB等语言的接口&#xff0c;实现了图像处理和计算机视觉方面的很多通用算法。 Mac安装OpenCV 在我们的深度学习的过程中&#xff0c;对于图像&#…

NodeJS在CentOs7下安装

node下载地址:https://nodejs.org/en/download/ 1.安装gcc $ yum install gcc-c 2.解压最新版本 $ mkdir /usr/local/node$ tar zxvf node-v6.11.4.tar.gz $ cd node-v6.11.4$ ./configure --prefix/usr/local/node# 在当前目录下编译安装Node$ make$ make install 3.验证安装 …

Python功能之反射

有如下文件: index.py 1<span style"font-family:宋体, SimSun;">#!/usr/bin/env python<br data-filtered"filtered"># -*- coding:utf-8 -*-<br data-filtered"filtered">__author__ ryan<br data-filtered"filter…

Django REST framework 分页

分页模式 rest framework中提供了三种分页模式&#xff1a; from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination 全局配置 REST_FRAMEWORK {DEFAULT_PAGINATION_CLASS: rest_framework.pagination.LimitOffsetPaginat…