DRF框架

在开发web应用中,通常有两种应用模式:

  • 前后端不分离
  • 前后端分离

下面介绍的时前后端分离情况下时,运用django-rest-framework框架实现数据传递

django-rest-framework安装与配置

  • 安装:pip install django-rest-framework

  • 官方文档

  • 添加rest_framework应用

    INSTALLED_APPS = [
        'rest_framework',
    ]
    

Serializer序列化器

序列化器的作用:

  • 进行数据校验
  • 对数据对象进行转换

示例:

书籍–>英雄(一对多关系)

# model.py模型类

from django.db import models


class BookInfo(models.Model):
    name = models.CharField(max_length=200, verbose_name='书籍名称')
    info_date = models.CharField(max_length=500, blank=True, verbose_name='相关信息')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')

    class Meta:
        db_table = 'tb_book'
        verbose_name = '书籍信息'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class HeroInfo(models.Model):
    hero_name = models.CharField(max_length=100, verbose_name='英雄名字')
    hero_info = models.CharField(max_length=200, verbose_name='英雄事迹')
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, related_name='book_hero', verbose_name='所属书籍')

    class Meta:
        db_table = 'tb_hero'
        verbose_name = '英雄信息'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.hero_name

  • 新建serializer.py (apps->books->serializer.py)

    from rest_framework import serializers
    from .models import BookInfo
    
    
    class HeroSerializer(serializers.Serializer):
        hero_name = serializers.CharField()
        hero_info = serializers.CharField()
        # 返回序列化关联对象的字符串表示方式(即__str__方法的返回值)
        book = serializers.StringRelatedField()
        # 返回序列化关联对象的主键
        # book = serializers.PrimaryKeyRelatedField(read_only=True)
    
    
    class BookSerializer(serializers.Serializer):
        name = serializers.CharField(max_length=100, min_length=2)
        info_date = serializers.CharField(max_length=200, default="")
        book_hero = HeroSerializer(many=True, read_only=True)
    
        # 单个字段验证
        def validate_name(self, value):
            if value == 'python':
                raise serializers.ValidationError('书籍名称不能为python')
            return value
    
        # 多个字段验证
        def validate(self, attrs):
            if attrs['info_date'] == 'bbb':
                raise serializers.ValidationError('字段名错误')
            return attrs
    

    选项参数

    参数名称作用
    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页面时,显示的字段帮助提示信息

五个扩展类使用

五个扩展类(配合GenericAPIview使用)继承自object

示例:ListModelMixin, CreateModelMixin, DestroyModelMixin, UpdateModelMixin

from rest_framework.mixins import ListModelMixin, CreateModelMixin, DestroyModelMixin, UpdateModelMixin

class BooksView(GenericAPIView, ListModelMixin, CreateModelMixin):
    queryset = BookInfo.objects.all()
    serializer_class = BookSerializer

    def get(self, request):
        return self.list(request)

    def post(self, request):
        return self.create(request)


class BookUD(GenericAPIView, UpdateModelMixin, DestroyModelMixin):
    queryset = BookInfo.objects.all()
    serializer_class = BookSerializer

    def put(self, request, pk):
        return self.update(request, pk)

    def delete(self, request, pk):
        return self.destroy(request, pk)

ListCreateAPIView,RetrieveUpdateDestroyAPIView使用

示例:

from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView

# 展示和创建模型
class BooksView(ListCreateAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookSerializer

# 获取单一对象,更新和删除模型
class BookRED(RetrieveUpdateDestroyAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookSerializer
  • 获取单一数据

    image-20210207152436144
  • 注意:路由配置参数必须为pk

    path('book/<str:pk>', views.BookRED.as_view(), name='bookRED')
    

两个基本视图集

image-20210207153132708

class Books(ViewSet):
    def list(self, request):
        books = BookInfo.objects.all()
        ser = BookSerializer(books, many=True)
        return Response(ser.data)

    def create(self, request):
        data = request.data
        ser = BookSerializer(data=data)
        ser.is_valid()
        ser.save()
        return Response(ser.data
# url.py配置
path('', views.Books.as_view({'get': 'list', 'post': 'create'}, name='books'))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值