一.第一版(一般不用)

# 声明序列化器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}}

最新文章

  1. 记lrd的高二上学期第五次调研考试
  2. Python框架之Tornado(二)请求阶段
  3. HTML的初体验
  4. iOS 学习 - 9.Block 入门
  5. 超级详细的iptable教程文档
  6. AngularJs angular.identity和angular.noop
  7. centos7编译安装pure-ftpd-1.0.42
  8. MSSQLSERVER之发布-分发-订阅
  9. Java的文件读写操作 <转>
  10. xampp 访问出现New XAMPP security concept
  11. C++primer 阅读点滴记录(一)
  12. SQL Server 2012 performance dashboard 安装
  13. file_get_contents()的另一种使用方法
  14. lnmp-zabbix
  15. https原理及tomcat配置https方法
  16. 只能输入数字的文本框-php
  17. CVE-2017-8464复现 (远程快捷方式漏洞)
  18. android升级后错误:Unable to execute dex: java.nio.BufferOverflowException.Check
  19. LeetCode(23)-Implement Queue using Stacks
  20. Jenkins的一些笔记

热门文章

  1. node+mongoose使用例子
  2. CentOS7安装OpenStack(Rocky版)-06.安装Neutron网络服务(控制节点)
  3. 关于self和super在oc中的疑惑与分析 (self= [super init])
  4. Sereja ans Anagrams 优先队列控制
  5. wpf 客户端【JDAgent桌面助手】开发详解(三) 瀑布流效果实现与UI虚拟化优化大数据显示
  6. Linux内核配置
  7. dbt seed 以及base ephemeral使用
  8. apache flink docker-compose 运行试用
  9. gridview 自动序号 合计
  10. baidu手机浏览器安卓4.5版公布:由于快,所以爱