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 ...
随机推荐
- 【代码笔记】Web-HTML-基础
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 【读书笔记】iOS-OCUnit-单元测试
一,新建立一个hello工程--->在左侧会看到helloTests---->helloTests.m.如下图所示. 二,打开查看会看到如下代码. #import <UIKit/UI ...
- Salesforce的站点和社区
社区 Salesforce提供了"社区"功能.建立一个"社区"相当于建立一个前端的网站,让用户.客户.其他合作伙伴等浏览并使用其中的内容. 启用Salesfor ...
- Linux原理总结 。。。更新中
问题: 1.32位和64位Linux系统的区别是什么? 答:64位系统CPU运行速度快,支持更大的内存,能够更好的发挥服务器硬件的性能,提高业务效率 2.描述Linux分区的知识(包括设备名.主分区. ...
- Linux 学习笔记之超详细基础linux命令 Part 11
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 10---------------- ...
- 安卓开发_浅谈DatePicker(日期选择器)
DatePicker继承自FrameLayout类,日期选择控件的主要功能是向用户提供包含年.月.日的日期数据并允许用户对其修改.如果要捕获用户修改日期选择控件中的数据事件,需要为DatePicker ...
- Java:构造代码块,静态代码块
本文内容: 局部代码块 构造代码块 静态代码块 补充 首发日期:2018-03-28 局部代码块: 局部代码块用于限制变量的生命周期,如果希望某些变量在某一过程之后直接失效而不希望被后面继续操作时,可 ...
- 如何修改redis配置
相关内容: Redis的配置: 通过config set命令修改配置 查看配置 设置新配置 直接修改配置文件redis.conf 常见配置项: 服务端连接相关 日志记录相关 服务端保持相关 首发时间: ...
- 安装Linux Mint 17后要做的20件事
Linux Mint 17 Qiana Cinnamon Linux Mint 17已经发布,定名为Qiana.Mint是Linux最佳发行版之一,它定位于桌面用户,关注可用性和简洁.它携带了风格迥异 ...
- sql语句进阶教程
转载自:http://blog.csdn.net/u011001084/article/details/51318434 最近从图书馆借了本介绍SQL的书,打算复习一下基本语法,记录一下笔记,整理一下 ...