day83
今日内容
rest_framework序列化
首先序列化需要对写一个类继承serializers.Serializer
方式一:在models的publish写一个__str__方法返回出版社名字
publish = serializers.CharField()
方式二:可以用source指定一个models中的方法
publish = serializers.CharField(source='publish.test')
方式三:直接用publish.他的字段名
publish = serializers.CharField(source='publish.name')
'''
class author_serializers(serializers.Serializer):
name = serializers.CharField()
age = serializers.CharField() class Books_serializers(serializers.Serializer):
xxx = serializers.CharField(source='name')
yyy = serializers.CharField(source='price')
# 方式一:在models的publish写一个__str__方法返回出版社名字
# publish = serializers.CharField()
# 方式二: 可以用source指定一个models中的方法
# publish = serializers.CharField(source='publish.test')
# 方式三:直接用publish.他的字段名
# publish = serializers.CharField(source='publish.name')
# SerializerMethodField可以指定一个方法,该方法需要时get_该字段名 publish = serializers.SerializerMethodField()
def get_publish(self, obj):
dic = {'name': obj.publish.name, 'price': obj.publish.email}
return dic # 可以继续使用序列化
authors = serializers.SerializerMethodField() # def get_authors(self, obj):
author = obj.authors.all()
pub = author_serializers(author, many=True)
return pub.data
''' class author_serializers(serializers.Serializer):
name = serializers.CharField()
age = serializers.CharField() class Books_serializers(serializers.ModelSerializer):
class Meta:
model = models.Book
# 查询所有字段
# fields = '__all__'
# 查询列表中的字段
fields = ['nid','name']
# 除了这几个字段不要,查询其余字段
# exclude = ['publish', 'authors']
# 指定查询深度
# depth = 1
# publish = serializers.CharField(source='publish.name')
# authors = serializers.SerializerMethodField()
# def get_authors(self, obj):
# authors = obj.authors.all()
# Authors = author_serializers(authors, many=True)
# return Authors.data
视图函数:
class Books(APIView):
def get(self, request):
db_books = models.Book.objects.all()
BOOKS = books(db_books, many=True)
return JsonResponse(BOOKS.data, safe=False) def delete(self, request):
id = request.query_params.get('id')
models.Book.objects.filter(pk=id).delete()
dic = {'status': 100, 'msg': '删除成功'}
return JsonResponse(dic) def put(self, request):
id = request.query_params.get('id')
name = request.data.get('name')
price = request.data.get('price')
models.Book.objects.filter(pk=id).update(name=name, price=price)
dic = {'status': 100, 'msg': '修改成功'}
return JsonResponse(dic, safe=False) def post(self, request):
p_name = request.data.get('name')
p_price = request.data.get('price')
p_publish = request.data.get('publish')
p_authors = request.data.get('authors')
book = models.Book.objects.create(name=p_name, price=p_price, publish_id=p_publish)
p_authors = p_authors.split(',')
for p_author in p_authors:
author = models.Author.objects.filter(pk=p_author).first()
print(author)
book.authors.add(author)
print(book)
ret = books(book, many=False)
return JsonResponse(ret.data, safe=False)
HyperlinkedIdentityField(用的很少)
-1 publish = serializers.HyperlinkedIdentityField(view_name='ttt',lookup_field='publish_id',lookup_url_kwarg='pky')
-2 view_name:路由的别名,lookup_field:根据表的哪个字段,来拼路径,lookup_url_kwarg:反向解析有名分组的名字
-3 写路由:url(r'^publish/(?P<pky>\d+)', views.Publish.as_view(),name='ttt'),
-4 实例化序列化类的时候,需要把request对象传过去
book_ser=BookSerializer(ret,many=True,context={'request': request})
设置:
class book_serializers(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = '__all__' url = serializers.HyperlinkedIdentityField(source='name', view_name='book', lookup_field='nid',
lookup_url_kwarg='pk')
# 该设置与form校验类似,都可设置一些参数(max_length,error_messages)
name = serializers.CharField(max_length=20, error_messages={'required': '必填', 'max_length': '太长'})
authors = serializers.CharField(required=False)
视图函数使用:
class BOOK(APIView):
def get(self, request, *args, **kwargs):
books = models.Book.objects.all()
bs = SER.book_serializers(books, many=True, context={'request': request})
return JsonResponse(bs.data, safe=False)
序列化组件的数据校验
-类比forms组件
-字段是否必填,通过required,来控制 authors=serializers.CharField(required=False)
-数据校验,生成一个序列化类的对象
-对象.is_valid()
-新增数据:
-对象.save()
-修改数据:
-在生成对象的时候,需要传instanse=查询出来的对象
-对象.save()
视图函数中使用:

设置时:

校验中的局部、全局钩子
def validate_name(self, value):
user = models.UserInfo.objects.filter(name=value).first()
if user:
raise ValidationError('用户名存在')
else:
return value def validate(self, attrs):
name = attrs.get('name')
pwd = attrs.get('pwd')
if name and pwd:
if name == pwd:
raise ValidationError('用户密码不能相同')
else:
return attrs
return attrs
day83的更多相关文章
- python 全栈开发,Day83(博客系统子评论,后台管理,富文本编辑器kindeditor,bs4模块)
一.子评论 必须点击回复,才是子评论!否则是根评论点击回复之后,定位到输入框,同时加入@评论者的用户名 定位输入框 focus focus:获取对象焦点触发事件 先做样式.点击回复之后,定位到输入框, ...
- day83:luffy:添加购物车&导航栏购物车数字显示&购物车页面展示
目录 1.添加购物车+验证登录状态 2.右上方购物车图标的小红圆圈数字 3.Vuex 4.购物车页面展示-后端接口 5.购物车页面展示-前端 6.解决一个购物车数量显示混乱的bug 1.添加购物车+验 ...
- 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】
点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...
- 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天)
点击了解更多Python课程>>> 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天) 课程大纲 1.这一期比之前的Python培新课程增加了很多干货:Linux ...
- 国内某Python大神自创完整版,系统性学习Python
很多小伙伴纠结于这个一百天的时间,我觉得完全没有必要,也违背了我最初放这个大纲上来的初衷,我是觉得这个学习大纲还不错,自学按照这个来也能相对系统的学习知识,而不是零散细碎的知识最后无法整合,每个人的基 ...
- 22期老男孩Ptython全栈架构师视频教程
老男孩Ptython全栈架构师视频教程 Python最新整理完整版22期视频教程 超60G课程容量<ignore_js_op> <ignore_js_op> <ignor ...
随机推荐
- SG Input 软件安全分析之fuzz
前言 前面介绍了通过静态读代码的方式去发现问题,这里介绍两种 fuzz 目标软件的方式. 相关文件 链接:https://pan.baidu.com/s/1l6BuuL-HPFdkFsVNOLpjUQ ...
- Android基础之内容提供者的实现
内容提供者可以实现应用间查询数据库的需求 一.在提供数据库访问的应用设置内容提供者 public class AccountProvider extends ContentProvider { sta ...
- Backbone.js学习之旅(一)
前言 刚到粑粑公司,就学习各种框架,进行各种开发,为了纪念挥泪的青春,只好写下…… 希望能合您胃口^_^!!! The First(文件准备) backobone 强制依赖于 underscore.j ...
- MSSQL清理所有用户数据库日志(SQLSERVER2008)
USE [master]; SET NOCOUNT ON; )=''; )=''; DECLARE @clearSql VARCHAR(MAX)=''; ; ,),TMP_WHILE_FLAG, T. ...
- 洗礼灵魂,修炼python(22)--自定义函数(3)—函数作用域,闭包
前面你看到嵌套两层的函数,也许你有感而发,想来点刺激的对不?那么如果每层内的变量名如果相同会怎样?拿个例子看下就知道: 报错了,报错信息大意是,本地变量‘num’引用前没有被赋值定义.这咋回事,我外层 ...
- Linux常用命令大全(新手入门)
系统信息: arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SM ...
- alsa声卡分析alsa-utils调用过程(二)-tinymixer
继上一篇文章:http://www.cnblogs.com/linhaostudy/p/8515277.html 三.tinymixer调用分析:(tinymixer.log搜索节点:/dev/snd ...
- AIX mount nfs 文件系统失败
报 mount: 1831-008 的错,配置系统参数后恢复. 操作系统版本为: # oslevel 6.1.0.0 LOG如下: # mount 192.168.240.69:/xyz/xvdh2/ ...
- win7系统保护配置现错误“文件名、目录名或卷标语法不正确。(0x8007007B)
windows7下系统保护功能很是鸡肋,有事会出现一下两个问题: 1.出现错误“文件名.目录名或卷标语法不正确.(0x8007007B) 2.保护设置列表中出现“Windows7_os(c:)(找不到 ...
- Pygame安装教程
1.python --version 查看安装的Python版本, pip --version 查看安装的pip版本, 升级pip命令: python -m pip install --upgra ...