模型类序列化器

模型类序列化器

  1. DRF提供了模型类序列化器: ModelSerializer
  2. 作用: 简化对应django模型类的序列化器的定义

ModelSerializer与常规的Serializer相同,但提供了:

  • 基于模型类自动生成一系列字段
  • 基于模型类自动为 Serializer 生成 validators,比如字段唯一的校验器
  • 包含默认的 create() 和 update() 的实现

1. 定义

比如我们创建一个 DepartmentSerializer2

class DepartmentSerializer2(serializers.ModelSerializer):

    class Meta:
        model = Department
        fields = ‘__all__‘    # 包含模型类中所有的字段
  • model 指明参照哪个模型类
  • fields 指定序列化器中的属性有哪些 (可以是模型类中的字段,也可以模型类中没有的但需要校验的属性,比如类似:短信验证码,确认密码)

python console 交互环境中,查看生成的序列化器

>>> s = DepartmentSerializer2()
>>> s
DepartmentSerializer2():
    id = IntegerField(label=‘ID‘, read_only=True)
    name = CharField(label=‘部门名称‘, max_length=20)
    create_date = DateField(label=‘成立时间‘)
    is_delete = BooleanField(label=‘是否删除‘, required=False)

2. 指定字段

1) fields属性:指定序列化器中包含哪些字段,如下:

class DepartmentSerializer2(serializers.ModelSerializer):
    class Meta:
        model = Department
        fields = (‘id‘, ‘name‘)

2) exclude属性:排除掉模型类中指定的字段

class DepartmentSerializer2(serializers.ModelSerializer):
    class Meta:
        model = Department
        exclude = (‘is_delete‘,)       # 注意:`exclude`不能与`fields`同时使用

3) 指明只读字段

可以通过 read_only_fields 指明只读字段,即 仅用于序列化输出,在反序列化时不会进行校验和修改

class DepartmentSerializer2(serializers.ModelSerializer):

    class Meta:
        model = Department
        fields = ‘__all__‘
        read_only_fields = (‘id‘, ‘create_date‘)  # 这些字段不能修改

4) 指定 关联属性的序列化方式

class EmployeeSerializer2(serializers.ModelSerializer):
    # 1. 返回关联对象的主键
    department = PrimaryKeyRelatedField(read_only=True)
    # 2. 返回关联对象的字符串表示(即Department类的 __str__ 方法的返回值)
    # department = StringRelatedField(read_only=True)
    # 3. 返回关联对象序列化器定义的属性
    # department = DepartmentSerializer(read_only=True)

    class Meta:
        model = Employee
        fields = ‘__all__‘

class DepartmentSerializer2(serializers.ModelSerializer):
    # 名字固定: 类名小写_set
    employee_set = PrimaryKeyRelatedField(read_only=True, many=True)
    # employee_set = StringRelatedField(read_only=True, many=True)
    # employee_set = EmployeeSerializer(read_only=True, many=True)

    class Meta:
        model = Department
        fields = ‘__all__‘                             # ok
        # fields = (‘id‘, ‘name‘, ‘employee_set‘)    # ok
        # fields = (‘id‘, ‘name‘)                     # error

3. 添加额外参数: extra_kwargs 属性

我们可以使用extra_kwargs参数为ModelSerializer添加或修改原有的选项参数

class EmployeeSerializer2(serializers.ModelSerializer):

    class Meta:
        model = Employee
        fields = ‘__all__‘
        extra_kwargs = {
            ‘name‘: {‘min_length‘: 5, ‘max_length‘: 20},
            ‘age‘: {‘min_value‘: 1, ‘max_value‘: 200},
        }

# 结果如下:

EmployeeSerializer2():
    id = IntegerField(label=‘ID‘, read_only=True)
    name = CharField(label=‘姓名‘, max_length=20, min_length=5)
    age = IntegerField(label=‘年龄‘, max_value=200, min_value=1)
    gender = ChoiceField(choices=((0, ‘男‘), (1, ‘女‘)), label=‘性别‘, required=False,
             validators=[<django.core.validators.MinValueValidator object>,
                         <django.core.validators.MaxValueValidator object>])
    salary = DecimalField(decimal_places=2, label=‘工资‘, max_digits=8)
    comment = CharField(allow_blank=True, allow_null=True, label=‘备注‘,
                        max_length=300, required=False)
    hire_date = DateField(label=‘入职时间‘, read_only=True)
    department = PrimaryKeyRelatedField(label=‘所属部门‘,
                                        queryset=Department.objects.all())

原文地址:https://www.cnblogs.com/chichung/p/9938813.html

时间: 2024-07-30 15:33:04

模型类序列化器的相关文章

django的模型类管理器-----------数据库操作的封装

模型实例方法 str():在将对象转换成字符串时会被调用. save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句. delete():将模型对象从数据表中删除,ORM框架会转换成对应的delete语句. 模型类的属性 属性objects:管理器,是Manager类型的对象,用于与数据库进行交互. 当没有为模型类定义管理器时,Django会为模型类生成一个名为objects的管理器,自定义管理器后,Django不再生成默认管理器objects. 管理器是D

Cf序列化器-Serializer解析

Cf序列化器-Serializer 定义序列化器 Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer. 例如,我们已有了一个数据库模型类BookInfo class BookInfo(models.Model): btitle = models.CharField(max_length=20, verbose_name='名称') bpub_date = models.DateFiel

16-DRF工程搭建与序列化器

1.DRF工程搭建 环境安装与配置 DRF是以Django扩展应用的方式提供的,所以我们可以直接利用Django环境,而无需创建(先创建Django环境). 1.安装DRF pip3 install djangorestframework 2.添加rest_framework应用 在django工程上的settings.py的INSTALLED_APPS中添加“rest_framework” INSTALLED_APPS = [ ... 'rest_framework', ] 使用Django

DRF序列化器的使用

序列化器的使用 序列化器的使用分两个阶段: 在客户端请求时,使用序列化器可以完成对数据的反序列化. 在服务器响应时,使用序列化器可以完成对数据的序列化. 序列化的基本使用 使用的还是上一篇博文中使用的数据库 先查询出一个学生对象 from students.models import Student student = Student.objects.get(id=3) 构造序列化器对象 from .serializers import StudentSerializer serializer

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

为什么DRF中有时候返回的json中图片是带域名的,有时候是不带域名的呢? 解析: 带域名的结果是在view中对模型类序列化的,DRF在序列化图片的时候 会检查上下文有没有request,如果有,就给图片加上域名, 比如说我们视图用的是apiview(): 我们需要序列化数据的时候,加  context={"request":request} TestSerilaizer(instance=instance, context={"request":request})

DRF框架之Serializer序列化器的序列化操作

在DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer. 今天,我们就先来学习一下Serializer序列化器. 使用Serializer序列化器的开发步骤: 1. 定义Serializer序列化器 首先,我们要在子应用中,创建见一个serializers.py文件,用来编写Serializer序列化器代码. from rest_framework import serializers # 定义序列化器 class BookInfoSerializer

Java类载入器(一)——类载入器层次与模型

类载入器 ??虚拟机设计团队把类载入阶段中的"通过一个类的全限定名来获取描写叙述此类的二进制字节流"这个动作放到Java虚拟机外部去实现.以便让应用程序自己决定怎样去获取所须要的类.实现这个动作的代码模块称为"类载入器". 类载入器层次(等级) ??从JVM的角度来讲,仅仅存在两种不同的类载入器. ??第一类是启动类载入器(Bootstrap ClassLoader):这个类载入器主要载入JVM自身工作须要的类.这个类载入器由C++语言实现(特指HotSpot).是

Hibernate类没有找到序列化器解决方案

Hibernate类没有找到序列化器解决方案 异常信息类似如下 No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (th

Django中ORM模型总结(二)[模型类的对应关系,模型类的属性,字段类型]

模型类的对应关系 多对多 创建模型类----->新闻类型类 class TypeInfo(models.Model): """创建新闻模型类""" tname = models.CharField(max_length=20) 创建模型类----->新闻内容类 class NewInfo(models.Model): """闯将新闻内容类""" ntitle = models