一.第一版(一般不用)

# 声明序列化器from rest_framework import serializersfrom djangoDome.models import Book

class PublisherSerializer(serializers.Serializer):    id = serializers.IntegerField()    title = serializers.CharField(max_length=32)

class AuthorSerializer(serializers.Serializer):    id = serializers.IntegerField()    name = serializers.CharField(max_length=32)

#自定义字段def my_validate(value):    if 'xxoo' in value.lower():        #抛敏感词汇        raise serializers.ValidationError('敏感词汇')    return value

class BookSerializer(serializers.Serializer):    id = serializers.IntegerField(required=False)    title = serializers.CharField(max_length=32,)# 自定义的加这个参数 validators=[my_validate,]    pub_time = serializers.DateField()    category=serializers.CharField(source='get_category_display',read_only=True) #此处为多选时用    #read_only = True 正序查找    publisher=PublisherSerializer(read_only=True) #多对一    authors=AuthorSerializer(many=True,read_only=True) #多对多用 many=True

    #write_only =True  反序查找  要重新定义    post_category = serializers.IntegerField(write_only=True)    publisher_id = serializers.IntegerField(write_only=True)    author_list = serializers.ListField(write_only=True)

    #重写 create 方法    def create(self, validated_data):        #validated_data 校验通过的数据 就是book_obj        # 通过ORM操作给Book表增加数据        book_obj=Book.objects.create(title=validated_data['title'],                                     pub_time=validated_data["pub_time"],                                     category=validated_data["post_category"],                                     publisher_id=validated_data["publisher_id"]                                     )        book_obj.authors.add(*validated_data['author_list'])        return book_obj      
#重写update 方法def update(self, instance, validated_data):    # instance 更新的book_obj 对象    # validated_data 校验通过的数据    # ORM做更新操作 对每个字段进行更新    instance.title=validated_data.get('title',instance.title)    instance.pub_time = validated_data.get("pub_time", instance.pub_time)    instance.category = validated_data.get("post_category", instance.category)    instance.publisher_id = validated_data.get("publisher_id", instance.publisher_id)    #此处是对多对多个字段 进行查询    if validated_data.get("author_list"):        #set 因为是列表多个数据        instance.authors.set(validated_data["author_list"])    #编辑一定要更新    instance.save()    return instance
    # 对单个值进行校验    def validate_title(self,value):        # value就是title的值 对value处理        if 'xxoo' not in value.lower():            raise serializers.ValidationError('少东西了')        return value

    #对所有字段进行 校验    def validate(self, attrs):        # attrs 字典有你传过来的所有的字段        if 'xxoo' in attrs['title'].lower() and attrs["post_category"] == 1:            return attrs        else:            raise serializers.ValidationError('分类或标题不合符要求')

二.第二版本(用这个)用这个添加表里面的信息 直接用字段名
class BookSerializer(serializers.ModelSerializer):

    #对多选字段,一对多,多对多字段 进行重新定义  此处为序列化的时候显示    category_display=serializers.SerializerMethodField(read_only=True)    publisher_info=serializers.SerializerMethodField(read_only=True)    authors_info=serializers.SerializerMethodField(read_only=True)    #多选查找  obj 就是序列化的每个Book对象    def get_category_display(self,obj):        return obj.get_category_display()

     #一对多查找    def get_publisher_info(self,obj):        #找到查找外键的对象        publisher_obj=obj.publisher        #返回publisher表的内容        return {'id':publisher_obj.id,'title':publisher_obj.title}

    #多对多的查找    def  get_authors_info(self,obj):        #找到所有的对象        authors_obj=obj.authors.all()        # 返回authors表的内容 推到式        return [{"id":i.id,'name':i.name}for i in authors_obj]

    class Meta:        model=Book        fields='__all__'        # exclude=["id"]        # 会让你这些所有的外键关系变成read_only = True 最多4层 不建议用        # depth = 1

        #相当于extra_kwargs={"默认的字段名称":{自定义的参数配置信息}}        #用在反序列化 给表字段添加参数        extra_kwargs={'publisher':{'write_only':True},                      "authors": {"write_only": True}}

serializers 序列化器里面进行 校验等的更多相关文章

  1. drf序列化器serializers.SerializerMethodField()的用法

    问题描述: 为什么DRF中有时候返回的json中图片是带域名的,有时候是不带域名的呢? 解析: 带域名的结果是在view中对模型类序列化的,DRF在序列化图片的时候 会检查上下文有没有request, ...

  2. DRF 序列化器-Serializer (2)

    作用 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 完成数据校验功能 3. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器 ...

  3. Serializers 序列化组件

    Serializers 序列化组件   为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转 ...

  4. 一: DRF web应用框架基础,及序列化器的使用

    ---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ...

  5. DRF中的序列化器

    DRF中的序列化器详细应用   视图的功能:说白了就是接收前端请求,进行数据处理 (这里的处理包括:如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化:如果前端是POST请求,假如要对数 ...

  6. drf3 Serializers 序列化组件

    为什么要用序列化组件 做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 给前端数据的时候都要转成json格式,那就需要对从数据库拿到的数据进行序列化. ...

  7. Serializers序列化组件

    Django的序列化方法 .values 序列化结果 class BooksView(View): def get(self, request): book_list = Book.objects.v ...

  8. django rest_framework Serializers 序列化组件

    为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿 ...

  9. 【转】Serializers 序列化组件

    https://www.cnblogs.com/MayDayTime/p/9890582.html 为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON ...

随机推荐

  1. Adobe Flash Player - imsoft.cnblogs

    Adobe Flash Player是一个跨平台.基于浏览器的应用程序.运行时,它可以跨屏幕和浏览器原汁原味地查看具有表现力的应用程序.内容和视频.Flash Player实现了移动屏幕上的高性能优化 ...

  2. Gym - 101550A Artwork (并查集在线做法)

    题目链接 题意:给你一个n*m的网格图,初始时格点全白,每次可以将一段连续的格点涂黑.求出每次操作之后白色连通块的数量. 看了看网上的题解,基本全是离线的做法.其实这道题是有在线的做法的,利用了对偶图 ...

  3. hot load那点事

    热加载,最初接触的时候是使用create-react-app的时候,创建一个项目出来,修改一点代码,页面自动刷新了,贫道当时就感叹,这是造福开发者的事情. 再后来编写静态页面的时候使用 VS Code ...

  4. 粘包、拆包发生原因滑动窗口、MSS/MTU限制、Nagle算法

    [TCP协议](3)---TCP粘包黏包 [TCP协议](3)---TCP粘包黏包 有关TCP协议之前写过两篇博客: 1.[TCP协议](1)---TCP协议详解 2.[TCP协议](2)---TCP ...

  5. POJ 3253 Fence Repair STL 优先队列

    这题做完后觉得很水,主要的想法就是逆过程思考,原题是截断,可以想成是拼装,一共有n根木棍,最后要拼成一根完整的,每两根小的拼成一根大的,拼成后的木棍长度就是费用,要求费用最少.显然的是一共会拼接n-1 ...

  6. SVN命令行使用总结

    1.上传项目到SVN服务器上svn import project_dir(本地项目全路径) http://192.168.1.242:8080/svn/IOS/Ben/remote_dir(svn项目 ...

  7. test20180830

    所有试题限制均为128MB,1Sec 总分100(•́へ•́╬). 试题一 A题 问题描述: Bob 有 n 个士兵,他们排成一列按照从左到右编号为 1 到 n,每个士兵都有自己的 IQ 值,Bob ...

  8. TensorFlow笔记-05-反向传播,搭建神经网络的八股

    TensorFlow笔记-05-反向传播,搭建神经网络的八股 反向传播 反向传播: 训练模型参数,在所有参数上用梯度下降,使用神经网络模型在训练数据上的损失函数最小 损失函数:(loss) 计算得到的 ...

  9. SpringCloud统一配置笔记

    Server端: pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...

  10. Qt QTableWidget用法总结

    转载:李宏兵 QTableWidget是QT程序中常用的显示数据表格的空间,很类似于VC.C#中的DataGrid.说到QTableWidget,就必须讲一下它跟QTabelView的区别了. QTa ...