Django REST framework(二)-序列化器定义与使用

下载REST framework

pip install djangorestframework

注册 REST framework

INSTALLED_APPS = [
    ...
    'rest_framework',
]

序列化:后端将数据对象进行转换返回前端

反序列化:后端对前端传入数据进行验证

一、 Serializer序列化器的定义与基本使用

Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer。

1、创建BookInfo模型类

例如,我们已有了一个数据库模型类BookInfo

from django.db import models


# Create your models here.
# 准备书籍列表信息的模型类
class BookInfo(models.Model):
    # 创建字段,字段类型...
    name = models.CharField(max_length=20, verbose_name='名称')
    pub_date = models.DateField(verbose_name='发布日期', null=True)
    readcount = models.IntegerField(default=0, verbose_name='阅读量')
    commentcount = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'bookinfo'  # 指明数据库表名
        verbose_name = '图书'  # 在admin站点中显示的名称

    def __str__(self):
        """定义每个数据对象的显示信息"""
        return self.name

Django REST framework(二)-序列化器定义与使用_第1张图片

  

2、继承Serializer定义BookInfoSerializer序列化器

我们想为BookInfo模型类提供一个序列化器,可以定义如下:

from rest_framework import serializers
from book.models import BookInfo
# ----------------------------------序列化的定义---------------------------------------
class BookInfoSerializer(serializers.Serializer):
    """
    定义BookInfo表序列化器(序列化的定义与模型定义要相互对应)
        指定需要返回的字段,继承自serializers.Serializer
    """

    name = serializers.CharField()
    pub_date = serializers.DateField()
    readcount = serializers.IntegerField()
    commentcount = serializers.IntegerField()
   

注意:serializer不是只能为数据库模型类定义,也可以为非数据库模型类的数据定义。serializer是独立于数据库之外的存在。

3、编写视图类

查询所有图书,并定义序列化器返回数据

class Books_drf(View):
    def get(self, request):
        """
        查询所有的图书信息
        """
        books = BookInfo.objects.all()
        # 定义序列化器ser
        # instance: 数据对象(查询集)
        # many:如果要被序列化的是包含多条数据的查询集QuerySet,通过添加many=True参数补充说明
                #如果是单条记录则否
        ser = BookInfoSerializer(instance=books, many=True)
        return http.JsonResponse(
            {
                'data': ser.data #获取序列化器数据
            },
        )

# 接口的定义
path('books/', Books_drf.as_view()),

 效果:Django REST framework(二)-序列化器定义与使用_第2张图片


二、嵌套序列化

1、定义PeopleInfo模型类

如果序列化返回的数据中包含关联表的数据,则需要在定义序列化时需要指明。

例如:现在有一个PeopleInfo模型表,字段book与BookInfo模型表中的主键相关联(一对多的关系)

# 准备人物列表信息的模型类
class PeopleInfo(models.Model):
    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    name = models.CharField(max_length=20, verbose_name='名称')
    gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
    description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')  # 外键
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    class Meta:
        db_table = 'peopleinfo'
        verbose_name = '人物信息'

    def __str__(self):
        return self.name

Django REST framework(二)-序列化器定义与使用_第3张图片

对于两表间相关联字段,可以采用以下几种方式:

2、PrimaryKeyRelatedField

此字段将被序列化为关联对象的主键。

# 定义关联查询的字段(一对多:小写表名_set)
# 返回多的那一个的表(peopleinfo)中的主键
peopleinfo_set = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

指明字段时需要包含read_only=True或者queryset参数:

  • 包含read_only=True参数时,该字段将不能用作反序列化使用

使用效果:

Django REST framework(二)-序列化器定义与使用_第4张图片

3、StringRelatedField

此字段将被序列化为关联对象的字符串表示方式(即__str__方法的返回值)

# 返回peopleinfo表中魔法方法__str__返回的对象标识名
peopleinfo_set = serializers.StringRelatedField(many=True, read_only=True)

使用效果

Django REST framework(二)-序列化器定义与使用_第5张图片

4、使用关联对象的序列化器

定义PeopleInfo模型表的序列化器

class PeopleInfoSerializer(serializers.Serializer):
    """
    定义PeopleInfo表序列化器(序列化的定义与模型定义要相互对应)
        指定需要返回的字段,继承自serializers.Serializer
    """
    name = serializers.CharField()
    gender = serializers.CharField()
    description = serializers.CharField()

BookInfoSerializer序列化器中定义

#
peopleinfo_set = PeopleInfoSerializer(many=True, read_only=True)

使用效果

Django REST framework(二)-序列化器定义与使用_第6张图片

在PeopleInfoSerializer序列化器中关联查询book模型表中的主键(多对一)

# 对于book字段是外键,返回关联表中的id,因为关联表为一对多关系中的一,不用加many参数
book = serializers.PrimaryKeyRelatedField(read_only=True)

效果:

Django REST framework(二)-序列化器定义与使用_第7张图片

三、字段与选项

1、常用字段类型

字段 字段构造方式
BooleanField BooleanField()
NullBooleanField NullBooleanField()
CharField CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)
EmailField EmailField(max_length=None, min_length=None, allow_blank=False)
RegexField RegexField(regex, max_length=None, min_length=None, allow_blank=False)
SlugField SlugField(maxlength=50, min_length=None, allow_blank=False)
正则字段,验证正则模式 [a-zA-Z0-9
-]+
URLField URLField(max_length=200, min_length=None, allow_blank=False)
UUIDField UUIDField(format='hex_verbose')
format:
1) 'hex_verbose' 如"5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
2) 'hex' 如 "5ce0e9a55ffa654bcee01238041fb31a"
3)'int' - 如: "123456789012312313134124512351145145114"
4)'urn' 如: "urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
IPAddressField IPAddressField(protocol='both', unpack_ipv4=False, **options)
IntegerField IntegerField(max_value=None, min_value=None)
FloatField FloatField(max_value=None, min_value=None)
DecimalField DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None)
max_digits: 最多位数
decimal_palces: 小数点位置
DateTimeField DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)
DateField DateField(format=api_settings.DATE_FORMAT, input_formats=None)
TimeField TimeField(format=api_settings.TIME_FORMAT, input_formats=None)
DurationField DurationField()
ChoiceField ChoiceField(choices)
choices与Django的用法相同
MultipleChoiceField MultipleChoiceField(choices)
FileField FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ImageField ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ListField ListField(child=, min_length=None, max_length=None)
DictField DictField(child=)

2、常用选项参数:

参数名称 作用
max_length 最大长度(针对字段类型CharField
min_lenght 最小长度最大长度(针对字段类型CharField
allow_blank 是否允许为空
trim_whitespace 是否截断空白字符
max_value 最小值(针对字段类型IntegerField
min_value 最大值(针对字段类型IntegerField

3、常用通用参数:

参数名称 说明
read_only 表明该字段仅用于序列化输出,默认False
write_only 表明该字段仅用于反序列化输入,默认False
required 表明该字段在反序列化时必须输入,默认True
default 反序列化时使用的默认值
allow_null 表明该字段是否允许传入None,默认False
validators 该字段使用的验证器
error_messages 包含错误编号与错误信息的字典
label 用于HTML展示API页面时,显示的字段名称
help_text 用于HTML展示API页面时,显示的字段帮助提示信息

你可能感兴趣的:(django,rest_framework,django,python,后端)