首页 > 其他分享 >drf之模型类序列化器ModelSerialize

drf之模型类序列化器ModelSerialize

时间:2022-09-27 23:56:25浏览次数:50  
标签:name get publish length 序列化 data ModelSerialize drf

序列化常用字段

charField  
BooleanField
IntegerField
DecimaField

# ListField:{name:'summer',hobby:[1,2,3,4]}
# DictField:{nane:'summer',wife:{'name':'哈哈哈'}}
常用字段参数
给charField用的参数:max_length     最大长度
                    min_length     最小长度
                    allow_blank	   是否允许为空
                    trim_whitespace	是否截断空白字符

给IntegerField用的参数:max_value 最大值   min_value 最小值           
            
            
# 通用字段
read_only  表示该字段只用作序列化  read_only=true
write_only 表示只用作反序列化   write_only=true

required 表明该字段在反序列化时必须输入,默认为True
error_messages 错误信息提示的字典
default	 反序列化时使用的默认值
label	用于HTML展示API页面时,显示的字段名称

序列化高级用法之source
source:1.用于字段名的修改    (在哪个字段修改就是改哪个字段的名字)
       # 让name字段在前端显示的时候叫bookname
       bookname = serializers.CharField(max_length=32,source='name')
        2.修改方法的名字
        3.可以用作表查询
代码展示
class BookSerializer(serializers.Serializer):
    name_detail = serializers.CharField(max_length=8, min_length=3,source='name')
    # 或
    publish_name = serializers.CharField(max_length=8, min_length=3,source='publish.name')
    # 或
    xx = serializers.CharField(max_length=8, min_length=3,source='xx') #source的xx表示表模型中得方法
      

定制序列化的方式

方式一
方式1:serializerMethodField()
 publish_de = serializers.SerializerMethodField()
  必须配合一个方法 get_字段名,需要加一个参数
   def get_book(self,obj):
      return  该方法返回的是什么 这个字段就是什么
代码实例: return {'name': obj.publish.name, 'city': obj.publish.city, 'email': obj.publish.email}
方式二
方式2: 在表模型中写方法
     表模型: def publish_detail(self):
                  return {}  返回的什么类型 就用什么类型的字段接收
代码实例:return {'name': self.publish.name, 'city': self.publish.city, 'email': self.publish.email}
     
    序列化py文件:publish_detail = serializers.DictField()

反序列化之多表关联数据

新增
1.多表关联数据新增
     def create(self, validated_data):
        book = Book.objects.create(
            name=validated_data.get('name'),
            price=validated_data.get('price'),
            publish_id=validated_data.get('publish'),
            publish_date=validated_data.get('publish_date') )
        authors = validated_data.get('author')  # 第三张表
        book.author.add(*authors)
        return book
修改
# 数据修改
      def update(self, instance, validated_data):
        instance.name = validated_data.get('name')
        instance.price = validated_data.get('price')
        instance.publish_date = validated_data.get('publish_date')
        instance.publish_id = validated_data.get('publish')
        instance.author.set(validated_data.get('author'))
        instance.save()
        return instance

模型类序列化器ModelSerializer的使用

# 与Serializer最大的区别就是不需要重写create方法和update方法,不需要写字段
  class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book   # 这里是需要序列化的模型类

        fields = ['name', 'price', 'publish_date', 'publish', 'publish_detail']
        # 需要序列化的字段名

        extra_kwargs = {
            'name': {'max_length': 8, 'min_length': 3, 'error_messages': {'min_length': "太短了"}},
            'price': {'max_value': 199, 'min_value': 60, 'error_messages': {'min_value': "不能再便宜了!"}},
            'publish_detail': {'read_only': True},
        }
       还可以在extra_kwargs内给需要校验的字段增加更多的属性
模型类总结
模型类总结:
1.定义一个类继承ModelSerializer
2.类内部定义class Meta:
3.在内部类中指定model(要序列化的表)
4.在内部类中指定fields(可以直接写__all__表示所有字段都有序列化,用[内写需要序列化的字段])
5.在内部类中指定extra_kwargs,给字段添加参数的
6.在序列化类中,可以重写某个字段,优先使用重写的字段
   name = serializers.SerializerMethodField()
    	def get_name(self, obj):
        	return 'sb---' + obj.name
7.不需要写create方法和update方法,任意表都可以直接存

反序列化的字段校验

字段参数的校验
1.字段自己的校验规则    在serializer.py
继承的是Serializer:
price = serializers.IntegerField(max_value=100, min_value=32)
继承的是ModelSerializer
 extra_kwargs = {
'price': {'max_value': 199, 'min_value': 60, 'error_messages': {'min_value': "不能再便宜了!"}}
 }
局部钩子
2.局部校验   继承的类方法都一样
  def validate_name(self, name):
        if name.startswith('sb'):
            raise ValidationError('名字中不可以带傻逼!')
        return name
全局钩子
 3.全局校验  (一般没有密码校验的话用的很少)
 def validate(self, attrs):
        if attrs.get('name') == attrs.get('publish_date'):
            raise ValidationError('名字不能等于日期')
        else:
            return attrs

标签:name,get,publish,length,序列化,data,ModelSerialize,drf
From: https://www.cnblogs.com/Hsummer/p/16736488.html

相关文章

  • Serializer序列化与ModelSerializer序列化
    Serializer序列化与ModelSerializer序列化序列化类高级用法之cource,修改序列化字段名字用法一使用cource的时候,字段参数可以指定序列化哪个参数,如果指定别人的字段那......
  • drf序列化类
    目录序列化类常用字段类和字段参数1.常用字段2.常用字段参数2.1.给CharField字段类使用的参数2.2.给IntegerField字段类使用的参数2.3.通用参数2.4.重点序列化类高级用法之......
  • 序列化类常用字段类和字段参数、序列化类高级用法之source、序列化类高级用法之定制序
    目录序列化类常用字段和字段参数常用字段类需要记住的字段类常用字段参数序列化类高级用法之source,修改序列化字段名字序列化类高级用法之定制序列化字段的俩种方式方式一......
  • drf ModelSerializer模型类序列化器
    序列化类的常用字段类和字段类参数 序列化类的常用字段类和字段类参数序列化类的字段类字段名=serializers.字段类型(字段参数)主要的字段类CharFieldBoolean......
  • 今日内容 序列化类的高级用法
    序列化类常用字段类和字段参数常用字段类型:字段字段构造方式BooleanFieldBooleanField()NullBooleanFieldNullBooleanField()CharFieldCharField(......
  • 【Django-rest-framework框架】第03回 序列化类字段与高级用法
    目录1.序列化类常用字段与字段参数1.1常用字段类型1.2选项参数1.3通用参数2.序列化类高级用法之sourse2.1source可以指定序列化表中得哪个字段2.2source如果是方......
  • drf之序列化类
     一、序列化类的常见字段类和常见参数1.1常见的字段类字段字段构造方式BooleanFieldBooleanField()NullBooleanFieldNullBooleanField()CharFieldChar......
  • drf学习笔记
    今日内容概要序列化类常用字段类和字段参数序列化类高级用法之source序列化类高级用法之定制序列化字段的两种方式反序列化之数据校验模型类序列化器的使用反序列化......
  • APIView的基本使用与序列化组件
    APIView的基本使用1.drf是一个第三方app,只能在django中使用2.安装drf后,导入视图类APOIView,所有后期要使用drf写视图类,都是继承AOIView及其子类3.在app注册中注册rest_......
  • Java类的序列化和反序列化
    Java类的序列化和反序列化序列化:指将对象转换为字节序列的过程,也就是将对象的信息转换成文件保存。反序列化:将字节序列转换成目标对象的过程,也就是读取文件,并转换为对象......