DjangoDRF序列化组件使用
创建一个Django项目,名字:untitled1
创建三张表
from django.db import models
class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.EmailField()
def __str__(self):
return self.name
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=32)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
publish = models.ForeignKey(to="Publish", to_field="nid", related_name='books', on_delete=models.CASCADE)
authors = models.ManyToManyField(to="Author")
def __str__(self):
return self.title
#####################################################################################
# 一对多反向查询
# urls.py
from django.urls import path
from bms import views
urlpatterns = [
# 一对多反向查询
path('index', views.PublishView.as_view()),
]
# views.py
class PublishView(APIView):
def get(self, request):
publishes = Publish.objects.all()
serializer_data = PublishSerializer1(publishes, many=True)
return Response(serializer_data.data)
# publish_serializer.py
class PublishSerializer1(serializers.ModelSerializer):
book_list = serializers.SerializerMethodField()
def get_book_list(self, obj):
# obj是序列化模型的对象
# 这是Book类,所以这里obj就是图书对象
print('----->', obj)
books = []
for book in obj.books.all():
books.append(book.title)
return books
class Meta:
model = Publish
fields = ('nid', 'name', 'city', 'email', 'book_list')
#####################################################################################
# 一对多正向查询/多对多正向查询
# urls.py
from django.urls import path
from bms import views
urlpatterns = [
# 一对多反向查询
path('index2', views.PublishView.as_view()),
]
# views.py
class BookView(APIView):
def get(self, request):
books = Book.objects.all()
serializer_data = BookSerializer1(books, many=True)
return Response(serializer_data.data)
# book_serializer.py
from rest_framework import serializers
from bms.models import Book, Publish
class PublishSerializer(serializers.ModelSerializer):
class Meta:
model = Publish
fields = ('nid', 'name', 'city', 'email')
class BookSerializer1(serializers.ModelSerializer):
# 一对多正向查询
publish = PublishSerializer()
# 多对多正向查询
author_list = serializers.SerializerMethodField()
# 请注意,get_必须与字段名称一致,否则会报错。
def get_author_list(self, obj):
# obj是序列化模型类的对象
# 这里是Book类,所以obj就是图书对象
print('----->', obj)
authors = []
for author in obj.authors.all():
authors.append(author.name)
return authors
class Meta:
model = Book
fields = ('title', 'publishDate', 'price', 'publish', 'author_list')
#####################################################################################
# urls.py
from django.urls import path
from bms import views
urlpatterns = [
# 一对多反向查询
path('index0', views.PublishView.as_view()),
]
# views.py
class BookView2(APIView):
def get(self, request):
books = Book.objects.all()
serializer_data = BookSerializer2(books, many=True)
return Response(serializer_data.data)
# book_serializer.py
class BookSerializer2(serializers.Serializer):
title = serializers.CharField(max_length=128)
publishDate = serializers.DateField()
price = serializers.DecimalField(max_digits=5, decimal_places=2)
# 处理一对多字段
publish = serializers.CharField()
publish_title = serializers.CharField(max_length=32, read_only=True, source='publish.name')
publish_email = serializers.CharField(max_length=32, read_only=True, source='publish.email')
# 处理多对多字段
author_list = serializers.SerializerMethodField()
def get_author_list(self, obj):
# obj是序列化模型的对象
# 这是Book类,所以这里obj就是图书对象
print('----->', obj)
authors = []
for author in obj.authors.all():
authors.append(author.name)
return authors
#####################################################################################
# urls.py
from django.urls import path
from bms import views
urlpatterns = [
# 一对多反向查询
path('authors', views.AuthorView1.as_view()),
]
# views.py
class AuthorView1(APIView):
def get(self, request):
authors = Author.objects.all()
serializer_data = AuthorSerializer(authors, many=True)
return Response(serializer_data.data)
# author_serializer.py
from rest_framework import serializers
from bms.models import Author
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = '__all__'
DjangoDRF序列化组件使用的更多相关文章
- DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer
DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...
- cvb源码分析,resful规范,drf,drf序列化组件,95
1 CBV的源码分析 -Class Base View(基于类的视图) -Function Base View(基于函数的视图) -def as_view 类方法 -def view:类方法内部,闭包 ...
- rest-framework之APIView 序列化组件
rest-framework之APIView 一 安装djangorestframework 方式一:pip3 install djangorestframework 方式二:pycharm图形化界面 ...
- drf 之序列化组件
序列化 把Python中对象转换为json格式字符串 反序列化 把json格式转为为Python对象. 用orm查回来的数据都是都是一个一个的对象, 但是前端要的是json格式字符串. 序列化两大功能 ...
- DRF 序列化组件
Serializers 序列化组件 Django的序列化方法 class BooksView(View): def get(self, request): book_list = Book.objec ...
- python全栈开发day99-DRF序列化组件
1.解释器组件源码分析 https://www.processon.com/view/link/5ba0a8e7e4b0534c9be0c968 2.基于CBV的接口设计 1).django循环que ...
- Serializers 序列化组件
Serializers 序列化组件 为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转 ...
- django rest_framework 序列化组件详解
为什么要用序列化组件 当我们做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到 ...
- DRF框架之 serializers 序列化组件
1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers ...
随机推荐
- vncviewer鼠标不同步问题
sh-4.1# virsh edit win7 把下面的参数: <input type='mouse' bus='ps2'/> 改成: <input type='tablet' bu ...
- 根据现有IP地址获取其地理位置(省份,城市等)的方法
根据现有IP地址获取其地理位置(省份,城市等)的方法 function GetIpLookup($ip = ''){ if(empty($ip)){ return '请输入IP地址'; } $res ...
- poj 3017 Cut the Sequence(单调队列优化 )
题目链接:http://poj.org/problem?id=3017 题意:给你一个长度为n的数列,要求把这个数列划分为任意块,每块的元素和小于m,使得所有块的最大值的和最小 分析:这题很快就能想到 ...
- 李洪强iOS经典面试题31-解释垃圾回收的原理
李洪强iOS经典面试题31-解释垃圾回收的原理 问题 我们知道,Android 手机通常使用 Java 来开发,而 Java 是使用垃圾回收这种内存管理方式. 那么,ARC 和垃圾回收对比,有什么优点 ...
- 文件IO之——阻塞和非阻塞及perror函数
读常规文件是不会阻塞的,不管读多少字节,read一定会在有限的时间内返回.从终端设备或网络读则不一定,如果从终端输入的数据没有换行符,调用read读终端设备就会阻塞,如果网络上没有接收到数据包,调用r ...
- 替换jar中的指定文件
替换jar 包下面的class 文件,很多人会想到直接用winrar 打开替换,在一般的情况下, 是可行的,但是如果说这个jar 的代码经过混淆后,会有大小写不同,文件名是相同的,在windos ...
- javascript深入理解js闭包【手动加精】
http://www.jb51.net/article/24101.htm 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用 ...
- Golang并发原理及GPM调度策略(一)
其实从一开始了解到go的goroutine概念就应该想到,其实go应该就是在内核级线程的基础上做了一层逻辑上的虚拟线程(用户级线程)+ 线程调度系统,如此分析以后,goroutine也就不再那么神秘了 ...
- linux在桌面和dos之间的切换
在linux 终端执行某条命令(init 5)时 提示一下错误 init :Need to be root 是提示要获取root权限 输入su 回车输入密码
- python 学习笔记 if语句
一.if语句的格式 语句块必须有相同的缩进. 语句块必须比if,elif,else多一层缩进 # 如果条件成立则执行语句块1, # 否则 如果条件2成立则执行语句块2 # 其他情况执行语句块3 # e ...