DRF框架---前言(简单使用)


DRF框架

Django REST Framework
序列化的概念

将程序中的一个数据结构类型转换为其他格式(字典、JSON、XML等),例如将Django中的模型类对象装换为JSON字符串,这个转换过程我们称为序列化。

反序列化

反之,将其他格式(字典、JSON、XML等)转换为程序中的数据,例如将JSON字符串转换为Django中的模型类对象,这个过程我们称为反序列化。

图解:

在这里插入图片描述


安装Django REST Framework

 pip install djangorestframework

使用

  1. Django项目内注册子应用
INSTALLED_APPS = [
    'rest_framework'
]
  1. 应用内新建一个文件 serializers.py 存放序列化器
  2. 根据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='评论量')
  1. 使用序列化对象
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', '射雕英雄传')])]}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值