DRF框架
Django REST Framework
序列化的概念
将程序中的一个数据结构类型转换为其他格式(字典、JSON、XML等),例如将Django中的模型类对象装换为JSON字符串,这个转换过程我们称为序列化。
反序列化
反之,将其他格式(字典、JSON、XML等)转换为程序中的数据,例如将JSON字符串转换为Django中的模型类对象,这个过程我们称为反序列化。
图解:
安装Django REST Framework
pip install djangorestframework
使用
- Django项目内注册子应用
INSTALLED_APPS = [
'rest_framework'
]
- 应用内新建一个文件 serializers.py 存放序列化器
- 根据models写序列化器
models.py代码
# 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='逻辑删除')
image = models.ImageField(upload_to='book', null=True, verbose_name='图片')
class Meta:
db_table = 'bookinfo' # 指明数据库表名
verbose_name = '图书' # 在admin站点中显示的名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.name
序列化器代码
from rest_framework import serializers
class BookInfoSerializer(serializers.Serializer):
"""图书数据序列化器"""
id = serializers.IntegerField(label='ID')
name = serializers.CharField(label='名称')
pub_date = serializers.DateField(label='发布日期')
readcount = serializers.IntegerField(label='阅读量')
commentcount = serializers.IntegerField(label='评论量')
- 使用序列化对象
from book.models import BookInfo
from book.serializers import BookInfoSerializer
# (1) 先查询出一个图书对象
book = BookInfo.objects.get(id=4)
# (2) 构造序列化器对象
serializer = BookInfoSerializer(book)
# (3)获取序列化数据
# 通过data属性可以获取序列化后的数据
serializer.data
结果:
{'id': 4, 'name': '雪山飞狐', 'pub_date': '1987-11-11', 'readcount': 58, 'commentcount': 24}
关于一对多关联的表怎么序列化
.
序列化“一”的那一方:
models.py代码:
class PeopleInfo(models.Model):
name = models.CharField(max_length=20, verbose_name='名称')
password = models.CharField(max_length=20, verbose_name='密码')
description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
book = models.ForeignKey(BookInfo, related_name='people', 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
book字段关联了BookInfo的外键
序列化器代码:
class PeopleInfoSerializer(serializers.Serializer):
"""英雄数据序列化器"""
id = serializers.IntegerField(label='ID')
name = serializers.CharField(label='名字')
password = serializers.CharField(label='密码')
description = serializers.CharField(label='描述信息')
序列化里面带上外键id:
read_only=True
序列化器类中添加一行
book = serializers.PrimaryKeyRelatedField(label='图书', read_only=True)
# 或者 (效果一样)
book = serializers.PrimaryKeyRelatedField(label='图书',queryset=BookInfo.objects.all())
运行:
from book.models import PeopleInfo
from book.serializers import PeopleInfoSerializer
person = PeopleInfo.objects.get(id=5)
serializer = PeopleInfoSerializer(instance=person)
serializer.data
结果:
{'id': 5, 'name': '梅超风', 'password': '123456abc', 'description': '九阴白骨爪', 'book': 1}
因为models类的关联的外键类中有__str__方法,序列化器类中添加一行可以使用book = serializers.StringRelatedField(label='图书')
生成json数据的时候生成的不是id而是__str__方法返回的值
结果:
{'id': 5, 'name': '梅超风', 'password': '123456abc', 'description': '九阴白骨爪', 'book': '射雕英雄传'}
序列化“多”的那一方:
models关联一的那一方添加一行
people = PeopleInfoSerializer(many=True)
运行:
from book.serializers import BookInfoSerializer
from book.models import BookInfo
book=BookInfo.objects.get(id=1)
s = BookInfoSerializer(book)
s.data
结果:
{'id': 1, 'name': '射雕英雄传', 'pub_date': '1980-05-01', 'readcount': 12, 'commentcount': 34, 'people': [OrderedDict([('id', 1), ('name', '郭靖'), ('password', '123456abc'), ('description', '降龙十八掌'), ('book', '射雕英雄传')]), OrderedDict([('id', 2), ('name', '黄蓉'), ('password', '123456abc'), ('description', '打狗棍法'), ('book', '射雕英雄传')]), OrderedDict([('id', 3), ('name', '黄药师'), ('password', '123456abc'), ('description', '弹指神通'), ('book', '射雕英雄传')]), OrderedDict([('id', 4), ('name', '欧阳锋'), ('password', '123456abc'), ('description', '蛤蟆功'), ('book', '射雕英雄传')]), OrderedDict([('id', 5), ('name', '梅超风'), ('password', '123456abc'), ('description', '九阴白骨爪'), ('book', '射雕英雄传')])]}