在开发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
-
获取单一数据
-
注意:路由配置参数必须为
pk
path('book/<str:pk>', views.BookRED.as_view(), name='bookRED')
两个基本视图集
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'))