9.2.动态设置serializer和permission获取用户信息

apps/users/views.py

from rest_framework.mixins import CreateModelMixin, RetrieveModelMixin
from rest_framework import viewsets
from rest_framework import permissions
from users.serializers import UserRegSerializer, UserDetailSerializer


class UserViewSet(CreateModelMixin, RetrieveModelMixin, viewsets.GenericViewSet):

    # 动态设置permission
    def get_permissions(self):
        if self.action == "create":
            return []
        elif self.action == "retrieve":
            return [permissions.IsAuthenticated()]
        return []

    # 动态设置serializer
    def get_serializer_class(self):
        if self.action == "create":
            return UserRegSerializer
        elif self.action == "retrieve":
            return UserDetailSerializer
        return UserDetailSerializer

    # 返回当前用户信息
    def get_object(self):
        return self.request.user

apps/users/serializers.py

import re
from datetime import datetime
from datetime import timedelta

from django.contrib.auth import get_user_model
from rest_framework import serializers
from rest_framework.validators import UniqueValidator

User = get_user_model()

class UserDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('name', 'birthday', 'gender', 'mobile', 'email')


class UserRegSerializer(serializers.ModelSerializer):
    code = serializers.CharField(required=True, write_only=True, max_length=4, min_length=4, label="验证码",
                                 error_messages={
                                     "blank": "请输入验证码",
                                     "required": "请输入验证码",
                                     "max_length": "验证码格式错误",
                                     "min_length": "验证码格式错误"
                                 },
                                 help_text='验证码')
    username = serializers.CharField(label="用户名", help_text="用户名", required=True, allow_blank=False,
                                     validators=[UniqueValidator(queryset=User.objects.all(), message="用户已经存在")])

    password = serializers.CharField(style={'input_type': 'password'}, help_text="密码", label="密码", write_only=True)

    def validate_code(self, code):
        verify_records = VerifyCode.objects.filter(mobile=self.initial_data["username"]).order_by("-add_time")
        if verify_records:
            last_record = verify_records[0]

            five_minutes_ago = datetime.now() - timedelta(hours=0, minutes=5, seconds=0)
            if five_minutes_ago > last_record.add_time:
                raise serializers.ValidationError("验证码过期")

            if last_record.code != code:
                raise serializers.ValidationError("验证码错误")

        else:
            raise serializers.ValidationError("验证码错误")

    def validate(self, attrs):
        attrs["mobile"] = attrs["username"]
        # attrs["password"] = make_password(attrs["password"])
        del attrs["code"]
        return attrs

    class Meta:
        model = User
        fields = ('username', 'code', 'mobile', 'password')

Last updated

Was this helpful?