在DRF开发前,应该准备一个测试模型,即先建表,由于之前已经创建了一个用户表。在这里直接使用。
ModelSerializer序列化器主要用于和单表相关的序列化。
视图和序列化器的关系是视图通过调用序列化器,处理数据。
1 创建一个ModelSerializer序列化器
在Examples/views下创建一个名为ModelSerializer.py的文件,其中包括两个类,一个是序列化器,一个是视图。由代码可以看出,序列化器减少了很多视图的工作。不需要在视图中手工序列化,而是把所有序列化的工作,由序列化器来集中完成。
代码如下:
from rest_framework import serializers from Applications.Organizations.models import UserInfo from GeneralTools.Verifications import mobileVerify from rest_framework.viewsets import ModelViewSet class UserInfoSerializer(serializers.ModelSerializer): """ ModelSerializer序列化器,一般与表相关 """ # 增加两个表中没有的临时字段 sms_code = serializers.CharField(label='短信验证码', write_only=True, help_text='短信验证码', min_length=6, max_length=6) token = serializers.CharField(label='JWT Token', read_only=True, help_text='JWT Token') class Meta: model = UserInfo # 此处如果需要所有字段,则直接设置 # fields = '__all__' # 如果只需要指定字段,则用列表明确 fields = ('id', 'username', 'password', 'mobile', 'sms_code', 'token', 'openid') # 增加或修改原有参数的字典格式 extra_kwargs = { 'id': { 'read_only': True, 'help_text': '用户ID' }, 'username': { 'help_text': '用户名', 'min_length': 2, 'max_length': 10, 'error_messages': { 'min_length': '用户名不能少于两个中文字符', 'max_length': '用户名不能大于20个中文字符', }, }, 'password': { 'write_only': True, 'min_length': 6, 'max_length': 20, 'error_messages': { 'min_length': '密码长度不能小于6位', 'max_length': '密码长度不能超过20位' }, 'help_text': '用户密码', }, 'mobile': { 'max_length': 11, 'min_length': 11, 'error_messages': { 'min_length': '手机号不能少于11位', 'max_length': '手机号不能大于11位', }, 'help_text': '手机号', }, 'openid': { 'help_text': '微信openid', } } @classmethod def validate_mobile(cls, value): # 'validate_' + '字段名'用于验证字段是否合格 if not mobileVerify(value): raise serializers.ValidationError('手机号格式错误!') return value def validate(self, attrs): """ 验证短信验证码 """ mobile = attrs['mobile'] sms_code = attrs['sms_code'] # 从redis数据库中取出当前手机号的验证码进行对比 return attrs def create(self, validated_data): """ 【功能描述】 1 如果用户存在,则修改 2 如果用户不存在,则创建 """ del validated_data['sms_code'] # 创建用户的时候,表示验证码通过了,可以删除 user = UserInfo.objects.filter(mobile=validated_data['mobile']).first() if user is not None: user.username = validated_data['username'] user.password = validated_data['password'] user.openid = validated_data['openid'] user.save() else: user = UserInfo.objects.create(**validated_data) return user def update(self, instance, validated_data): """ 【功能描述】根据ID修改用户资料 """ instance.username = validated_data.get('username') instance.password = validated_data['password'] instance.openid = validated_data['openid'] instance.mobile = validated_data['mobile'] instance.save() return instance class UserInfoViewSet(ModelViewSet): """ 视图 """ queryset = UserInfo.objects.all() serializer_class = UserInfoSerializer
2 配置Examples分路由
本章详解ModelSerializer序列化器,视图和路由则用最简方式。DRF提供Router自动生成查询、新增、修改、删除等功能。代码如下:
找到Examples下的urls.py文件,增加Router路由。
from django.urls import path from Applications.Examples.views import ExpHome, CoreAPI from rest_framework.routers import DefaultRouter from .views.ModelSerializer import UserInfoViewSet urlpatterns = [ path('ExpHome/', ExpHome.ExoHome.as_view()), path('CoreAPI/', CoreAPI.CoreAPI.as_view()), path('LoginHome/', CoreAPI.LoginHome.as_view()), ] router = DefaultRouter() # 可以处理视图的路由器 router.register('UserInfo', UserInfoViewSet) # 向路由器中注册视图集 urlpatterns += router.urls # 将路由器中的所以路由信息追到到django的路由列表中
3 运行效果
4 接口测试
每个接口右上角有Interact,点击后可测试接口功能。即方便开发者自己测试,又方便测试人员测试。如图: