今日内容

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的更多相关文章

  1. python 全栈开发,Day83(博客系统子评论,后台管理,富文本编辑器kindeditor,bs4模块)

    一.子评论 必须点击回复,才是子评论!否则是根评论点击回复之后,定位到输入框,同时加入@评论者的用户名 定位输入框 focus focus:获取对象焦点触发事件 先做样式.点击回复之后,定位到输入框, ...

  2. day83:luffy:添加购物车&导航栏购物车数字显示&购物车页面展示

    目录 1.添加购物车+验证登录状态 2.右上方购物车图标的小红圆圈数字 3.Vuex 4.购物车页面展示-后端接口 5.购物车页面展示-前端 6.解决一个购物车数量显示混乱的bug 1.添加购物车+验 ...

  3. 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】

    点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...

  4. 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天)

    点击了解更多Python课程>>> 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天) 课程大纲 1.这一期比之前的Python培新课程增加了很多干货:Linux ...

  5. 国内某Python大神自创完整版,系统性学习Python

    很多小伙伴纠结于这个一百天的时间,我觉得完全没有必要,也违背了我最初放这个大纲上来的初衷,我是觉得这个学习大纲还不错,自学按照这个来也能相对系统的学习知识,而不是零散细碎的知识最后无法整合,每个人的基 ...

  6. 22期老男孩Ptython全栈架构师视频教程

    老男孩Ptython全栈架构师视频教程 Python最新整理完整版22期视频教程 超60G课程容量<ignore_js_op> <ignore_js_op> <ignor ...

随机推荐

  1. Django Rest framework 之 权限

    django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) django res ...

  2. 【pygame游戏编程】第一篇-----创建一个窗口

    下面我们一起来创建一个背景为蓝色的窗口作为游戏编程的开始: import sys import pygame def creat_screen(): #初始化pygame pygame.init() ...

  3. Linux下查看tomcat控制台输出信息

    1.进入tomcat/logs文件夹下 2.# tail -f catalina.out -f:实时刷新

  4. 2018下半年Android面试历程

    个人看法:可以总结下他的面试经历以及涉及到的面试题 下面开始正文吧: 从今年下半年以来就开始在杭州准备简历找工作了,原因基本都懂的,没多少工资,投递简历的渠道是Boss,偶尔也在拉钩上投递,刚开始把简 ...

  5. python并发编程之线程

    操作系统线程理论 参考资料:http://www.cnblogs.com/Eva-J/articles/8306047.html 线程和python 理论知识 全局解释器锁GIL Python代码的执 ...

  6. ipa的plist文件查看

    1.ipa包解压缩:右键.ipa包,使用[归档实用工具/unarchiver]打开 2.进入解压缩后的payload目录,右键ipa包-显示包内容 3.找到info.plist文件,直接拖拽出来 4. ...

  7. [20171128]rman Input or output Memory Buffers.txt

    [20171128]rman Input or output Memory Buffers.txt --//做一个简单测试rman 的Input or output Memory Buffers. 1 ...

  8. Linux常用命令大全(新手入门)

    系统信息:  arch 显示机器的处理器架构(1)  uname -m 显示机器的处理器架构(2)  uname -r 显示正在使用的内核版本  dmidecode -q 显示硬件系统部件 - (SM ...

  9. EntityFramework Code-First 简易教程(十一)-------从已存在的数据库中映射出表

    怎样从一个已存在的数据库中映射表到 entity 实体? Entity Framework 提供了一个简便方法,可以为已存在的数据库里的所有表和视图创建实体类(entity class),并且可以用 ...

  10. SMBus与I2C的差别

    The I²C bus and the SMBus are popular 2-wire buses that areessentially compatible with each other. - ...