下载REST framework
pip install djangorestframework
注册 REST framework
INSTALLED_APPS = [
...
'rest_framework',
]
序列化:后端将数据对象进行转换返回前端
反序列化:后端对前端传入数据进行验证
Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer。
例如,我们已有了一个数据库模型类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
我们想为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是独立于数据库之外的存在。
查询所有图书,并定义序列化器返回数据
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()),
如果序列化返回的数据中包含关联表的数据,则需要在定义序列化时需要指明。
例如:现在有一个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
对于两表间相关联字段,可以采用以下几种方式:
此字段将被序列化为关联对象的主键。
# 定义关联查询的字段(一对多:小写表名_set)
# 返回多的那一个的表(peopleinfo)中的主键
peopleinfo_set = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
指明字段时需要包含read_only=True或者queryset参数:
使用效果:
此字段将被序列化为关联对象的字符串表示方式(即__str__方法的返回值)
# 返回peopleinfo表中魔法方法__str__返回的对象标识名
peopleinfo_set = serializers.StringRelatedField(many=True, read_only=True)
使用效果
定义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)
使用效果
在PeopleInfoSerializer序列化器中关联查询book模型表中的主键(多对一)
# 对于book字段是外键,返回关联表中的id,因为关联表为一对多关系中的一,不用加many参数
book = serializers.PrimaryKeyRelatedField(read_only=True)
效果:
字段 | 字段构造方式 |
---|---|
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 | 最大长度(针对字段类型CharField) |
min_lenght | 最小长度最大长度(针对字段类型CharField) |
allow_blank | 是否允许为空 |
trim_whitespace | 是否截断空白字符 |
max_value | 最小值(针对字段类型IntegerField) |
min_value | 最大值(针对字段类型IntegerField) |
参数名称 | 说明 |
---|---|
read_only | 表明该字段仅用于序列化输出,默认False |
write_only | 表明该字段仅用于反序列化输入,默认False |
required | 表明该字段在反序列化时必须输入,默认True |
default | 反序列化时使用的默认值 |
allow_null | 表明该字段是否允许传入None,默认False |
validators | 该字段使用的验证器 |
error_messages | 包含错误编号与错误信息的字典 |
label | 用于HTML展示API页面时,显示的字段名称 |
help_text | 用于HTML展示API页面时,显示的字段帮助提示信息 |