rest framework-序列化-长期维护
############### 表结构 ###############
from django.db import models 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
############### 序列化类 ###############
from rest_framework import serializers
from app01.models import *
# 为queryset,model对象做序列化 class PublishSerializers(serializers.Serializer):
name = serializers.CharField()
email = serializers.CharField() class PublishModelSerializers(serializers.ModelSerializer):
class Meta:
model=Publish
fields="__all__" 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() # 这是多对多字段更好的实现方法,一定要实现一个对应的方法,格式就是get_字段的名字,
def get_authors(self,obj):
temp=[]
for obj in obj.authors.all():
temp.append(obj.name)
return temp '''
序列化BookSerializers(book_list,many=True)过程:
temp=[]
for obj in book_list:
temp.append({
"title":obj.title,
"price":obj.price,
"pub_date":obj.pub_date,
"publish":str(obj.publish), # obj.publish.name
#"authors":obj.authors.all,
"authors": get_authors(obj)
}) ''' class BookModelSerializers(serializers.ModelSerializer): # 这个Serializer就类似form,这个ModelSerializer就类似于modelform,
class Meta:
model = Book
fields = "__all__" # 这里面实现了一对多和多对多,一对多是展示的id,多对多是展示的一个id列表, #publish=serializers.CharField(source="publish.pk") # 如果你不写单个的字段就是用ModelSerializer的,如果你自己写了就用你自己的,
# publish=serializers.HyperlinkedIdentityField( # 超链接
# view_name="detailpublish", #detailpublish 这是publisher的链接,detailpublish这是路由的地方写的别名,链接地址,
# lookup_field="publish_id",
# lookup_url_kwarg="pk"
# ) # authors=serializers.CharField(source="authors.all")
# authors = serializers.SerializerMethodField()
# def get_authors(self,obj):
# temp=[]
# for obj in obj.authors.all():
# temp.append(obj.name)
# return temp # def create(self, validated_data): # 如果你自定义了一对多的字段,是不支持source写法的,你需要重写create方法,
# print("validated_data",validated_data)
# book=Book.objects.create(title=validated_data["title"],price=validated_data["price"],pub_date=validated_data["pub_date"],publish_id=validated_data["publish"]["pk"])
# book.authors.add(*validated_data["authors"]) # 这种写法你要记住,
#
# return book class AuthorModelSerializers(serializers.ModelSerializer):
class Meta:
model=Author
fields="__all__"
############### 视图 ###############
from django.shortcuts import render,HttpResponse
from django.views import View
from rest_framework.response import Response
from app01.models import *
from app01.serilizer import *
from rest_framework.views import APIView
from app01.utils import *
from rest_framework import mixins
from rest_framework import generics
from rest_framework import viewsets
from app01.models import User,Book
from rest_framework.parsers import JSONParser
from rest_framework.response import Response class PublishView(APIView): #这个apiview就是rest_framework 的
def get(self,request): # restframework
# 取数据
# print("request.data", request.data)
# print("request.data type", type(request.data))
# print(request._request.GET)
# print(request.GET)
# 序列化
# 方式1:
# publish_list=list(Publish.objects.all().values("name","email")) # 方式2:
# from django.forms.models import model_to_dict
# publish_list=Publish.objects.all()
# temp=[]
# for obj in publish_list:
# temp.append(model_to_dict(obj)) # 方式3:
# from django.core import serializers
# ret=serializers.serialize("json",publish_list) # 序列组件
publish_list = Publish.objects.all() # 这是一个queryset对象,
ps = PublishModelSerializers(publish_list, many=True) # PublishModelSerializers这个类就是为了序列化创建的,many=True这个参数一定要有,
return Response(ps.data) def post(self,request):
# 取数据
# 原生request支持的操作
# print("POST",request.POST)
# print("body",request.body)
# # print(request)
# print(type(request))
from django.core.handlers.wsgi import WSGIRequest
# 新的request支持的操作
# print("request.data",request.data)
# print("request.data type",type(request.data)) # post请求的数据
ps = PublishModelSerializers(data=request.data)
if ps.is_valid():
print(ps.validated_data)
ps.save() # 里面有create方法
return Response(ps.data)
else:
return Response(ps.errors) class PublishDetailView(APIView):
def get(self, request, pk): publish = Publish.objects.filter(pk=pk).first()
ps = PublishModelSerializers(publish)
return Response(ps.data) def put(self, request, pk):
publish = Publish.objects.filter(pk=pk).first()
ps = PublishModelSerializers(publish, data=request.data)
if ps.is_valid():
ps.save()
return Response(ps.data)
else:
return Response(ps.errors) def delete(self, request, pk):
Publish.objects.filter(pk=pk).delete() return Response() class BookView(APIView):
# authentication_classes = [TokenAuth]
# permission_classes = []
# throttle_classes = []
# parser_classes = [JSONParser]
def get(self,request):
book_list=Book.objects.all()
print(book_list) # 分页: pnp=MyPageNumberPagination()
books_page=pnp.paginate_queryset(book_list,request,self)
#这样就分页完成了,
bs=BookModelSerializers(books_page,many=True,context={'request': request}) # bs = BookModelSerializers(book_list, many=True, context={'request': request}) print(bs.data)
return Response(bs.data)
def post(self,request):
# post请求的数据
bs=BookModelSerializers(data=request.data)
if bs.is_valid():
print(bs.validated_data)
bs.save()# create方法
return Response(bs.data)
else:
return Response(bs.errors) class BookDetailView(APIView): def get(self,request,id): book=Book.objects.filter(pk=id).first()
bs=BookModelSerializers(book,context={'request': request}) # context={'request': request}你加了超链接就必须有这个,固定写法
return Response(bs.data) def put(self,request,id): # 修改单条数据,一定要传递数据,而且必填字段都要填,你改动局部
book=Book.objects.filter(pk=id).first()
bs=BookModelSerializers(book,data=request.data)
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return Response(bs.errors) def delete(self,request,id):
Book.objects.filter(pk=id).delete() return Response()
############### 路由 ###############
from django.conf.urls import url,include
from django.contrib import admin urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^publishes/$', views.PublishView.as_view(),name="publish"), # View:view(request)=====APIView:dispatch()
url(r'^publishes/(?P<pk>\d+)/$', views.PublishDetailView.as_view(),name="detailpublish"), # View:view(request)=====APIView:dispatch()
# url(r'^books/$', views.BookView.as_view(),name="books"),
# url(r'^books/(\d+)/$', views.BookDetailView.as_view(),name="detailbook"), ]
############### 序列化总结 ###############
这么一总结,也没有多少东西, #######
1,使用serializers.Serializer
2,使用serializers.ModelSerializer ######
1,单个字段
2,一对多字段
3,多对多字段
4,超链接字段 #######
1,操作所有数据的查看
2,操作单个数据的新增
3,操作单个数据的查看
4,操作单个数据的修改
5,操作单个数据的删除
############### 序列化 ###############
rest framework-序列化-长期维护的更多相关文章
- Django REST Framework序列化器
Django序列化和json模块的序列化 从数据库中取出数据后,虽然不能直接将queryset和model对象以及datetime类型序列化,但都可以将其转化成可以序列化的类型,再序列化. 功能需求都 ...
- rest framework 序列化之depth遇到用户表外键的尴尬情况
rest framework 序列化之depth遇到用户表外键的尴尬情况 问题:ModelSerializer序列化使用depth=1直接扩表把用户表所有信息查询出来的情况 class xxxSeri ...
- [Django REST framework - 序列化组件、source、钩子函数]
[Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ...
- Django REST framework序列化
一.简介 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API. 官网:https://www.djang ...
- Django Rest framework序列化流程
目录 一 什么是序列化 二 Django REST framework配置流程之Serializer 三 Django REST framework配置流程之ModelSerializer 一 什么是 ...
- rest framework-restful介绍-长期维护
############### django框架-rest framework ############### # django rest framework 框架 # 为什么学习这个res ...
- python后端面试第七部分:项目部分--长期维护
################## 项目部分 ####################### 1,你怎么测试自己的代码的?自测 2,开发使用windows还是Linux,虚拟环境的 ...
- 02 Django REST Framework 序列化
01-创建序列化类 # 方式一: publish_list = models.Publish.objects.all() # 导入序列化组件 from django.core import seria ...
- rest framework 序列化
serializers 序列化组件 可以实现很轻松的互相转换,最常用的组件 ,用量最大的组件 源码位置 rest_framework.serializers 源码中需要用到的 rest_fram ...
- python学习-- Django REST framework 序列化数据操作
一.为什么要返回json数据? 一般来说前端要用到从后台返回的数据来渲染页面的时候,这时候后台就需要向前端返回json类型的数据,简单直观便于理解 ,就类似于 {"xxx":{[& ...
随机推荐
- 每天一点点之vue框架开发 - axios解决跨越问题
1.安装 npm install axios 或者 使用 bower: bower install axios 或者直接使用 cdn: <script src="https://unp ...
- torch文档学习笔记
下面为官方文档学习笔记 http://pytorch.org/docs/0.3.0/index.html 1.torch.Tensor from __future__ import print_ ...
- Spring框架-IOC和AOP
IOC:它并不是一种技术实现,而是一种设计思想.在任何一个有实际开发意义的程序项目中,我们会使用很多类来描述它们特有的功能,并且通过类与类之间的相互协作来完成特定的业务逻辑.这个时候,每个类都需要负责 ...
- ref与out区别
ref与out out.ref都是传递引用(内存地址),使用后都将改变原来参数的数值. ref 当调用方法时,在方法中会对ref传入的参数数值进行改变,若使用ref参数,则方法定义和调用方法都 ...
- adaboost 基于错误提升分类器
引自(机器学习实战) 简单概念 Adaboost是一种弱学习算法到强学习算法,这里的弱和强学习算法,指的当然都是分类器,首先我们需要简单介绍几个概念. 1:弱学习器:在二分情况下弱分类器的错误率会低于 ...
- 【每日Scrum】第四天冲刺
一.计划会议内容 连接数据库报错,解决问题中. 二.任务看板 三.scrum讨论照片 四.产品的状态 无 五.任务燃尽图
- 零基础程序员入门Linux系统 !如何快速恢复系统?
新手在学习Linux系统的时候,难免会遇到命令输错,或系统出错的难题.那么如何快速解决呢?本文就先给你一个后悔药,让你快速备份并恢复Linux系统.本文将以Ubuntu为例,在这之前,你需要一台服务器 ...
- hdu 3483 矩阵乘法
这个题目上周对抗赛题目,搞了我好久 对数学这种不是很敏感 其实都不是自己想出来的,看其他的资料和博客的推导 还是有点难度的,反正我是推不出来 通过二项式定理的化简 有两个博客写得比较好 http:// ...
- Img转base64
function getBase64Image(img) { var canvas = document.createElement("canvas"); canvas.width ...
- 数字证书原理(ssl,https)
https://blog.csdn.net/qq_34115899/article/details/81298284 关于私钥公钥数字签名数字证书.https.RSA的一些讲解 http://www. ...