一 、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)的更多相关文章

  1. 第三章、drf框架 - 序列化组件 | Serializer

    目录 第三章.drf框架 - 序列化组件 | Serializer 序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer( ...

  2. drf框架 - 序列化组件 | Serializer

    序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 ...

  3. django rest_framework 序列化组件详解

    为什么要用序列化组件 当我们做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到 ...

  4. 4)drf序列化组件 Serializer(偏底层)、ModelSerializer(重点)、ListModelSerializer(辅助群改)

    知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 一.Serializer 偏底层 一般不用 理解原理 1.序列化准备 ...

  5. Django day25 序列化组件(*****)

    序列化:将变量从内存中存储或传输的过程称之为序列化 1.序列化组件是干什么用的? 对应着表,写序列化的类 2.如何使用序列化组件 Serializer 1) 重命名:用source:xx = seri ...

  6. drf框架 - 序列化组件 | ModelSerializer (查,增,删,改)

    ModelSerializer 序列化准备: 配置 settings.py # 注册rest_framework框架 INSTALLED_APPS = [ ... 'rest_framework' ] ...

  7. Django 框架 Form组件

    一.Form组件简介 Form组件是django中一个非常强大的组件,在处理服务端和前端的交互上大大的提高了开发人员的开发速度. Form组件的功能: 用于处理前后端的数据认证(显示错误信息) 用于生 ...

  8. Django框架----Form组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  9. Django框架----Form组件补充

    一.Form类 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML; 1.Django内置字段如下: 1 Field 2 required=T ...

随机推荐

  1. CodeForces - 1253D(并查集)

    题意 https://vjudge.net/problem/CodeForces-1253D 一个无向图,对于任意l,r,如果l到r有路径,那么l到m也有路径(l<m<r),问最少加多少条 ...

  2. 系统设计与分析:Alpha版本2成绩汇总

    作业要求 1.作业内容 作业具体要求以及评分标准 2.评分细则 •给出开头和团队成员列表(10’) •给出发布地址以及安装手册(20’) •给出测试报告(40’) •给出项目情况总结(30’)   * ...

  3. 洛谷 P4316 绿豆蛙的归宿

    洛谷 P4316 绿豆蛙的归宿 洛谷传送门 题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边都有一个长度, ...

  4. 树莓派开机主动发送自己的局域网ip/外网ip到你的微信

    开机时,树莓派主动发送自己的内网ip以及公网ip到你的微信上,这样就能方便地使用ssh或VNC. 操作步骤 下载目录下的 boot_getIP_send_Wechat.py 到你的 Raspberry ...

  5. [Algorithm] 1290. Convert Binary Number in a Linked List to Integer

    Given head which is a reference node to a singly-linked list. The value of each node in the linked l ...

  6. 洛谷P2508 [HAOI2008]圆上的整点

    题目描述 求一个给定的圆$ (x^2+y^2=r^2) $,在圆周上有多少个点的坐标是整数. 输入格式 \(r\) 输出格式 整点个数 输入输出样例 输入 4 输出 4 说明/提示 \(n\le 20 ...

  7. stacky footer

    div{border:1px solid #CCC;} .wrapper{ width:100%; height:100%; display:flex; flex-flow: column; } .c ...

  8. Kubernetes 遇到的问题

    Kubernetes 遇到的问题 k8s 版本 k8s v1.13.5 docker 18.09.2 问题一 kubelet 报错 May 22 10:14:42 test-ops-k8s-03 ku ...

  9. 五、Spring之自动装配

    Spring之自动装配 ​ Spring利用依赖注入(DI),完成对IOC容器中各个组件依赖关系的赋值. [1]@Autowired @Autowired 注解,它可以对类成员变量.方法及构造函数进行 ...

  10. poj-2234 Matches Game Nim

    Matches Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13264   Accepted: 7712 Des ...