0008 基于DRF框架开发()

  在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,点击后可测试接口功能。即方便开发者自己测试,又方便测试人员测试。如图:

猜你喜欢

转载自www.cnblogs.com/dorian/p/12369100.html
今日推荐