序列化器的简单使用
3.1 新建app
django-admin startapp sers
3.2 注册app
INSTALLED_APPS = [
# 'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
# 'django.contrib.messages',
'django.contrib.staticfiles',
'app',
'app01',
'sers',
'rest_framework',
]
3.3 新建序列化器
sers/serializers.py:
from rest_framework import serializers
"""
serializers 是drf提供给开发者调用的序列化器模块
里面声明了所有可用序列化器的基类:
1.Serializer 序列化基类,drf中所有的序列化器类都必须继承于 Serialaizer
2.ModelSerializer 模型序列化器,是序列化器基类的子类,在工作中除了Serializer基类,最常用的序列化基类
"""
class Student1Serializer(serializers.Serializer):
"""学生信息序列化器"""
# 1.转换的字段说明
# 字段 = serializer.字段类型(选项=选项值)
id = serializers.IntegerField()
name = serializers.CharField()
sex = serializers.CharField()
age = serializers.IntegerField()
info = serializers.CharField()
# 2.如果当前序列化器继承的是Modelserializer,则需要声明需要调用的模型信息
# class Meta:
# model = 模型名
# fields = ["数据库字段名1","数据库字段名2","数据库字段名3",....,"数据库字段名n",] 或 "__all__"
# 3.验证代码的对象方法(钩子函数)
# def validate(self, attrs): # validate是固定的
# pass
# return attrs
#
# def validate_<字段名>(self,data): # 方法名必须以validate_<字段名>来命名
# psss
# return data
# 4.模型操作方法
# def create(self, validated_data): # 添加数据后,字典自动变为模型对象
# pass
#
# def update(self, instance, validated_data): # 更新数据后,字典自动变为模型对象
# pass
3.4 视图(序列化器的调用)
from django.views import View
from django.http import JsonResponse
from .serializers import Student1Serializer
from app.models import *
class StudentView(View):
def get(self, request):
"""序列化器-序列化器的调用-序列化一个模型对象数据"""
# 1.获取数据集
queryset = studentsInfo.objects.first()
# 2.实例化序列化器,得到序列化器对象
serializer = Student1Serializer(instance=queryset)
# 3.调用序列化器对象的data属性获取序列i化后的数据
data = serializer.data
# 4.响应数据
return JsonResponse(data=data, status=200, safe=False, json_dumps_params={"ensure_ascii": False})
# 这里的get2是无效的,只是起到注释掉的作用,如果要序列化多个的话改为get就行了,上面的get要改为别的名字
def get2(self, request):
"""序列化器-序列化器的调用-序列化多个模型对象数据"""
# 1.获取数据集
queryset = studentsInfo.objects.all()
# 2.实例化序列化器,得到序列化器对象,转换多个要使用many=True
serializer = Student1Serializer(instance=queryset, many=True)
# 3.调用序列化器对象的data属性获取序列i化后的数据
data = serializer.data
# 4.响应数据
return JsonResponse(data=data, status=200, safe=False, json_dumps_params={"ensure_ascii": False})
3.5 路由
sers/urls.py:
from django.urls import path, re_path
from . import views
urlpatterns = [
path('students/', views.StudentView.as_view()),
]
drfdemo1/urls.py:
from django.urls import path, include
urlpatterns = [
# path('admin/', admin.site.urls),
path('api/',include('app.urls')),
path('api/', include('app01.urls')),
path('sers/', include('sers.urls')),
]
3.6 api接口测试
序列化一条数据
GET 127.0.0.1:8000/sers/students/
{
"id": 1,
"name": "小明",
"sex": "男",
"age": 22,
"info": "这个人很懒,什么也没有留下"
}
序列化多条数据
GET 127.0.0.1:8000/sers/students/
[
{
"id": 1,
"name": "小明",
"sex": "男",
"age": 22,
"info": "这个人很懒,什么也没有留下"
},
{
"id": 2,
"name": "小红",
"sex": "女",
"age": 18,
"info": "这个人很懒,什么也没有留下"
},
{
"id": 3,
"name": "张三",
"sex": "男",
"age": 25,
"info": "这个人很懒,什么也没有留下"
},
{
"id": 4,
"name": "李四",
"sex": "男",
"age": 24,
"info": "这个人很懒,什么也没有留下"
},
{
"id": 5,
"name": "闵麒良",
"sex": "男",
"age": 23,
"info": "河工胡歌"
},
{
"id": 12,
"name": "孙明辉",
"sex": "男",
"age": 23,
"info": "这个人很懒,什么都没有留下"
}
]
3.7 序列化器常用字段类型
字段 | 描述 |
---|---|
IntegerField | 整型 |
CharField | 字符型 |
FloatField | 浮点型 |
BooleanField | 布尔型 |
EmailField | 邮箱类型 |
DecimalField | 保留小数点型 |
ImageField | 图片型 |
FileField | 文件型 |
ChoiceField | 多重选择型 |
DateField | 日期型 |
TimeField | 时间型 |
DateTimeField | 日期时间型 |
PrimaryKeyRelatedField | 外键关联型 |
3.8 字段参数
参数名称 | 说明 |
---|---|
max_length | 字符串最大长度 |
min_length | 字符串最小长度 |
max_value | 数字最大值 |
min_value | 数字最小值 |
read_only | 默认False,若设置为True,表明对应字段只在序列化操作中起作用 |
write_only | 默认作用False,若设置为True,表明对应字段只在反序列化操作中起作用 |
required | 默认True,表明对应字段在反序列化操作进行数据校验时必须传入 |
defalut | 字段设置的默认值,设置的同时,required值自动变为False |
label | 字段的描述 |
error_messages | 字典类型,自定义错误描述,可针对长度、大小、是否必填来设置,如{“required”:“XXX字段不能为空”} |