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":{[& ...
随机推荐
- 运行xv6
我们使用Qemu在Ubuntu下运行 1. 安装Qemu sudo apt-get install qemu 执行 qemu-system-i386 ,如果弹出Qemu界面说明安装成功了 2. 编译x ...
- ubuntu 18.04 安装 Redis-server
Redis 安装 Redis是一款内存键值存储,以其灵活性,性能和广泛的语言支持而闻名.本教程将演示如何在Ubuntu 18.04服务器上安装和配置Redis.主要内容包括: 安装 Redis Red ...
- CentOS 7.3 下部署基于 Node.js的微信小程序商城
本文档为微信小程序商城NideShop项目的安装部署教程,欢迎star NideShop商城api服务:https://github.com/tumobi/nideshop NideShop微信小程序 ...
- 设置MySQL客户端连接使用的字符集
设置MySQL客户端连接使用的字符集 时间:2014-03-05 来源:服务器之家 投稿:root 考虑什么是一个"连接":它是连接服务器时所作的事情.客户端发送SQL ...
- vue打包空白及字体路径错误问题
vue项目打包后空白 在config/index.js文件中 assetsPublicPath: '/', 改为 assetsPublicPath: './', build: { // Templat ...
- h5-语义化标签的兼容性问题
1.html代码 <header>头</header> <nav>导航栏</nav> <main> <article>左< ...
- pc页面在移动端浏览时部分字体放大,与pc字体大小不一致(Font Boosting)
最近做一个页面时,需要pc的页面在移动端浏览时保持pc的样式缩小.但是发现部分文字被放大了.看上去特别诡异.如下图 绿框是PC端查看时的正常样式,红框是移动端看的字体放大的诡异样式 是什么原因呢? 后 ...
- PHPCMS 1分钟快速搭建
一.下载CMS源码 https://www.yzmcms.com/xiazai 下载完成后得到一个这样的压缩包 接着下载PHPStudy,安装只要一直点下一步就可以了 安装完成后打开,如下图启动两个地 ...
- Python批量重命名文件
批量替换文件名中重复字符: # -*- coding: UTF-8 -*- import os path = raw_input("请输入文件夹路径:") oldname = ra ...
- idtcp实现文件下载和上传
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...