Django框架 --序列化组件(serializer)
一 、Django自带序列化组件
Django内置的serializers(把对象序列化成json字符串)
from django.core import serializers
from django.core import serializers
def test(request):
book_list = Book.objects.all()
ret = serializers.serialize("json", book_list)
return HttpResponse(ret)
二 rest-framework序列化之Serializer
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.title class Publish(models.Model):
name=models.CharField(max_length=32)
email=models.EmailField()
def __str__(self):
return self.name class Author(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField()
def __str__(self):
return self.name
view部分(视图层):
1、利用for循环来实现序列化(繁琐)
def get(self, request):
response = {'status': 100, 'data': None}
ll = [{'name': book.name, 'price': book.price} for book in books]
# 返回数据是json格式数据
response['data'] = ll
# safe = True 表示数据可以是列表
return JsonResponse(response, safe=False)
2、利用Django提供的序列化组件(不可控需要的字段)
Django内置的serializers
from django.core import serializers def get(self,request):
books = models.Book.objects.all()
ret=serializers.serialize('json','queryset对象')
#ret就是序列化之后的字符串了,不需要再序列化了
return HttpResponse(ret)
3、利用drf提供的序列化组件
(1)基于Serializer类实现序列化——基本语法
-1 先导入
from rest_framework.serializers import Serializer
from rest_framework import serializers
-2 写一个类,继承Serializer
-3 在类内部写属性:
name=serializers.CharField()
-4 使用:
先生成对象,需要传参数 instance:要序列化的对象(可能是queryset,也可能是单个对象)
many:如果是queryset---True,,如果是单个对象--False
-5 序列化的数据:对象.data --->是一个字典
from rest_framework.views import APIView
from rest_framework import serializers class BookSerializer(serializers.Serializer):
name = serializers.CharField() class Book(APIView):
def get(self, request):
# 要序列化的对象(可以是queryset,也可以是单个对象)
# book = models.Books.objects.filter(name='红楼梦').first()
# ser = BookSerializer(instance=book,many=False)
books = models.Books.objects.all()
ser = BookSerializer(instance=books, many=True)
data = ser.data
return JsonResponse(data, safe=False)
(2)基于Serializer类实现序列化——高级语法
<1>非关联字段或一对多字段
可以不用source,直接用 字段名 当变量名,必须为字段名
也可以用 source
来指定需要的目标字段 (推荐,尽量让字段名不要泄露)
source
也可以用来指定模型层中的方法
一对多关联关系,可以在 source 中用 .
来指定字段,例如取出版社名字,用 source='publish.name'
from rest_framework.views import APIView
from rest_framework import serializers class BookSerializer(serializers.Serializer):
# 利用source来指定魔表字段,给key取别名
aaa = serializers.CharField(source='name') # 等价于 name = serializers.CharField()
price = serializer.CharField()
publish_name = serializer.CharField(source='publish.name')
# source 也可以用来指定模型层中的方法
t = serializer.CharField(source='publish.test') class Book(APIView):
def get(self, request):
books = models.Books.objects.all()
ser = BookSerializer(instance=books, many=True)
data = ser.data
return JsonResponse(data, safe=False)
<2>一对多或者多对多字段
多对多要用SerializerMethodField()
,然后定义一个get_变量名
的方法,方法名字必须为
get_变量名get_变量名
方法要传参,传入当前对象,例如在 BookSerializer 中就是book对象
在get_变量名
方法中,也可以对数据进行序列化,例如取书的所有作者,就可以对作者序列化然后 return
from rest_framework.views import APIView
from rest_framework import serializers # 用于对author的数据进行序列化
class AuthorSerializer(serliazer.Serializer):
name = serializer.CharField()
age = serializer.CharField() class BookSerializer(serializers.Serializer):
# 利用source来给key取别名
aaa = serializers.CharField(source='name') # 等价于 name = serializers.CharField()
price = serializer.CharField() # book和publish是一对多的关系,也可以用SerializerMethodField
publish = serializer.SerializerMethodField()
def get_publish(self, book):
pub = book.publish.name
return pub # book和authors是多对多的关系,用SerializerMethodField
au = serializer.SerializerMethodField()
def get_au(self, obj):
aus = obj.authors.all()
ll = []
for obj_au in aus:
ll.append({'au_name':obj_au.name,'au_age':obj_au.age})
return ll # 也可以在方法中使用序列化类序列化
'''
def get_au(self, book):
# 获取这本书的所有作者
aus = book.authors.all()
# 可以在方法中对authors的数据进行序列化
au_ser = AuthorSerializer(aus,many=True)
return au_ser.data
''' class Book(APIView):
def get(self, request):
books = models.Books.objects.all()
ser = BookSerializer(instance=books, many=True)
data = ser.data
return JsonResponse(data, safe=False)
(3)基于ModelSerializer类实现序列化
<1>基本语法
from app01.models import Book # 这样序列化得到的数据,authors是中都是author_id
class BookSerializer(serializer.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
<2>重写属性
from app01.models import Book # 这样序列化得到的数据,authors中都是author_id,publish也是publish_id
class BookSerializer(serializer.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
# 重写属性authors和publish
puhlish = serializer.CharField(source='publish.name')
authors = serializer.SerializerMethodField()
def get_authors(self,book):
aus = book.authors.all()
# 可以在方法中对authors的数据进行序列化
au_ser = AuthorSerializer(aus,many=True)
return au_ser.data
<3>其他属性
fields = ['id','name'] ---------> 指定序列化这两个字段
exclude = ['publish','create_time'] ----------> 除了这两个字段外,其余的序列化
depth = 2 ----------> 指定深度,即跨表。值为1表示跨一次表;值为2表示跨两次表
class BookSerializer(serializers.ModelSerializer):
# 必须写一个内部类,名字叫Meta
class Meta:
model = Book
# fields = '__all__'
# 指定只取这两个字段
fields = ['nid','name']
# 去掉指定的字段
# exclude=['publish','authors']
# fields,跟exclude不能连用
# 指定深度(官方建议小于10,我给你的建议小于3)
depth = 2
Django框架 --序列化组件(serializer)的更多相关文章
- 第三章、drf框架 - 序列化组件 | Serializer
目录 第三章.drf框架 - 序列化组件 | Serializer 序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer( ...
- drf框架 - 序列化组件 | Serializer
序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 ...
- django rest_framework 序列化组件详解
为什么要用序列化组件 当我们做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到 ...
- 4)drf序列化组件 Serializer(偏底层)、ModelSerializer(重点)、ListModelSerializer(辅助群改)
知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 一.Serializer 偏底层 一般不用 理解原理 1.序列化准备 ...
- Django day25 序列化组件(*****)
序列化:将变量从内存中存储或传输的过程称之为序列化 1.序列化组件是干什么用的? 对应着表,写序列化的类 2.如何使用序列化组件 Serializer 1) 重命名:用source:xx = seri ...
- drf框架 - 序列化组件 | ModelSerializer (查,增,删,改)
ModelSerializer 序列化准备: 配置 settings.py # 注册rest_framework框架 INSTALLED_APPS = [ ... 'rest_framework' ] ...
- Django 框架 Form组件
一.Form组件简介 Form组件是django中一个非常强大的组件,在处理服务端和前端的交互上大大的提高了开发人员的开发速度. Form组件的功能: 用于处理前后端的数据认证(显示错误信息) 用于生 ...
- Django框架----Form组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django框架----Form组件补充
一.Form类 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML; 1.Django内置字段如下: 1 Field 2 required=T ...
随机推荐
- Mysql 连接提示 Client does not support authentication protocol requested by server 客户端不支持服务器请求的身份验证协议;考虑升级MySQL客户端
由于查阅了很多百度文档发现很多方法比较复杂,所以写个备忘: 首先,进入MySQL 8.0Command Line Client -Unicode,输入密码,登录进去. 然后,在命令行输入:ALTER ...
- Sqlserver 2014 下载
ed2k://|file|cn_sql_server_2014_enterprise_edition_x64_dvd_3932882.iso|2898847744|A33CE10CD989083D1A ...
- ARM的堆栈方式
当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack): 当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack): 根据对战的生成方式分为:递增堆栈(Asce ...
- Tensorflow之多元线性回归问题(以波士顿房价预测为例)
一.根据波士顿房价信息进行预测,多元线性回归+特征数据归一化 #读取数据 %matplotlib notebook import tensorflow as tf import matplotlib. ...
- MongoDB Java(七)
在 Java 程序中如果要使用 MongoDB,你需要确保已经安装了 Java 环境及 MongoDB JDBC 驱动. mongodb-driver jar 下载地址:http://central. ...
- CentOS7 部署 Django 项目
1. 更新系统软件包 yum update -y 2. 安装软件管理包和可能使用的依赖 yum -y groupinstall "Development tools" yum in ...
- 2019 SDN阅读作业
2019 SDN阅读作业 1.为什么需要SDN?SDN特点? 答:因为随着网络规模的不断扩大,封闭的网络设备内置了过多的复杂协议,增加了运营商定制优化网络的难度,科研人员无法在真实环境中规模部署新协议 ...
- POJ2976Dropping tests(分数规划)
传送门 题目大意:n个二元组a[i],b[i],去掉k个,求sigma a[i]/ sigma b[i]的最大值 代码: #include<iostream> #include<cs ...
- 【2019.8.7 慈溪模拟赛 T2】环上随机点(ran)(自然算法)
简单声明 我是蒟蒻不会推式子... 所以我用的是乱搞做法... 大自然的选择 这里我用的乱搞做法被闪指导赐名为"自然算法",对于这种输入信息很少的概率题一般都很适用. 比如此题,对 ...
- 从项目中理解let和const为什么如此重要
变量声明 变量声明方式 伴随js诞生的var // 语法 var varName = value var a = 1 // 这样子你就得到了一个变量 var缺陷场景分析 var specialUser ...