python drf_Python正课134 —— DRF 进阶1

restful就是一个接口开发的约定俗成的开发规范。不局限于django或者drf,即便我们不使用drf,其实也能实现符合restful规范的api接口。同时,drf框架不是restful作者开发出来的!!!

一:序列化器-Serializer

作用:

1.序列化,序列化器会把模型对象转换成字典,将来提供给视图经过response以后变成json字符串

2.反序列化,把客户端发送过来的数据,经过视图调用request以后变成python字典,序列化器可以把字典转成模型

3.反序列化,完成数据校验功能和操作数据库

1.定义序列化器

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

接下来,为了方便演示序列化器的使用,我们另外创建一个新的子应用sers

python manage.py startapp sers

先注册子应用到项目中,settings.py,代码:

INSTALLED_APPS = [

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'rest_framework', # 把drf框架注册到django项目中

'students', # 注册子应用

'sers',

]

因为我们已有了一个数据库模型类students/Student,我们直接在接下来的演示中使用这个模型。

class Student(models.Model):

# 模型字段

name = models.CharField(max_length=100,verbose_name="姓名")

sex = models.BooleanField(default=1,verbose_name="性别")

age = models.IntegerField(verbose_name="年龄")

class_number = models.CharField(max_length=5,verbose_name="班级编号")

description = models.TextField(max_length=1000,verbose_name="个性签名")

class Meta:

db_table="tb_student"

verbose_name = "学生"

verbose_name_plural = verbose_name

我们想为这个模型类提供一个序列化器,可以命名为StudentSerializer,

我们都会把序列化器代码保存到当前子应用下的serializers.py模块中,

可以定义如下:

from rest_framework import serializers

# 声明序列化器,所有的序列化器都要直接或者间接继承于 Serializer

# 其中,ModelSerializer是Serializer的子类,ModelSerializer在Serializer的基础上进行了代码简化

class StudentSerializer(serializers.Serializer):

"""学生信息序列化器"""

# 1. 需要进行数据转换的字段

id = serializers.IntegerField()

name = serializers.CharField()

age = serializers.IntegerField()

sex = serializers.BooleanField()

description = serializers.CharField()

# 2. 如果序列化器集成的是ModelSerializer,则需要声明调用的模型信息

# 3. 验证代码

# 4. 编写添加和更新模型的代码

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

2.常用字段类型:

字段

字段构造方式

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=)

选项参数:

参数名称

作用

max_length

最大长度[适用于字符串,列表,文件]

min_lenght

最小长度[适用于字符串,列表,文件]

allow_blank

是否允许数据的值为空,如果使用这个选项,则前端传递过来的数据必须有这个属性。

trim_whitespace

是否截断空白字符

max_value

【数值】最小值

min_value

【数值】最大值

通用参数:

参数名称

说明

read_only

表明该字段仅用于序列化输出,默认False

write_only

表明该字段仅用于反序列化输入,默认False

required

表明该字段在反序列化时必须输入,默认True

default

反序列化时使用的默认值

allow_null

表明该字段是否允许传入None,默认False

validators

该字段使用的验证器

error_messages

包含错误编号与错误信息的字典

label

用于HTML展示API页面时,显示的字段名称

help_text

用于HTML展示API页面时,显示的字段帮助提示信息

3.创建Serializer对象

定义好Serializer类后,就可以创建Serializer对象了。

Serializer的构造方法为:

Serializer(instance=None, data=empty, **kwarg)

说明:

1)用于序列化时,将模型类对象传入**instance**参数

2)用于反序列化时,将要被反序列化的数据传入**data**参数

3)除了instance和data参数外,在构造Serializer对象时,还可通过**context**参数额外添加数据,如

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值