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 ...
随机推荐
- Callable接口--有返回值的线程
Callable java5之前是没有返回值的,Java5新增了Callable接口获得线程的返回值,可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.Cal ...
- Linux 学习笔记之超详细基础linux命令 Part 4
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 3----------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 3
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...
- mac下载的excel如果带有超链接,url被转义问题
注释的代码是file开头的,这种链接在mac系统进行跳转url会转义 hyperlink 还有一种就是http这种就可以正常跳转了. String sLink = basePath + "/ ...
- Django 信息
Request information USER admin GET No GET data POST No POST data FILES No FILES data COOKIES Variabl ...
- [20170705]理解linux su命令.txt
[20170705]理解linux su命令.txt --//我一般在维护时经常使用root用户登录,然后su - oracle 转到其他用户操作--//一般都加入 - 参数.这个已经成了条件反射.. ...
- 11-OpenLDAP主从同步
OpenLDAP主从同步 阅读视图 部署环境 OpenLDAP服务器初始化 配置主服务器同步策略 配置从服务器 OpenLDAP主从同步验证 故障诊断 1. 部署环境 本文以两台服务器为蓝本演示其同步 ...
- python第五天 字典
今天,已经系统的学习了一下文件相关操作!对三级菜单代码进行的优化: 菜单文件:以字典格式 menu.txt {'第一层':{'第二层':{'第三层':['内容1','内容2','内容3']}},'第一 ...
- CSS| 框模型-輪廓
轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用.CSS outline 属性规定元素轮廓的样式.颜色和宽度. 相關屬性 outline-color 属性 ou ...
- Linux RCU 机制详解
1.简介: RCU(Read-Copy Update)是数据同步的一种方式,在当前的Linux内核中发挥着重要的作用. RCU主要针对的数据对象是链表,目的是提高遍历读取数据的效率,为了达到目的使用R ...