用户管理之增加用户

增加用户

接口分析

请求方式:POST /meiduo_admin/users/

    #-------用户管理---------
    url(r'^users/$',users.UserView.as_view()),

请求参数: 通过请求头传递jwt token数据。

参数类型是否必须说明
usernamestr用户名
mobilestr手机号
passwordint密码
emailstr邮箱

返回数据: JSON

 {
        "id": "用户id",
        "username": "用户名",
        "mobile": "手机号",
        "email": "邮箱"
    }
返回值类型是否必须说明
idint用户id
usernamestr用户名
mobilestr手机号
emailstr邮箱

后端实现

【获取用户信息用的是ListApiView,而保存需要用到CreateAPIView,为了简化代码,可以直接调用父类ListCreateAPIView方法】

from rest_framework.generics import ListCreateAPIView
from meiduo_admin.serializers.user import UserSerializer, UserAddSerializer
from meiduo_admin.utils import UserPageNum
from users.models import User


class UserView(ListCreateAPIView):
    pagination_class = PageNum
    # 根据不同的请求方式返回不同序列化器
    def get_serializer_class(self):
        # 请求方式是GET,则是获取用户数据返回UserSerializer
        if self.request.method == 'GET':
            return UserSerializer
        else:
            # POST请求,完成保存用户,返回UserAddSerializer
            return UserAddSerializer

    def get_queryset(self):
        keyword = self.request.query_params.get('keyword')
        if keyword is '':
            return User.objects.all()
        else:
            return User.objects.filter(username=keyword)

注意:

在获取和保存用户时,请求路径是一样的,所以我们在一个UserView类视图中完成两个功能,所以我们需要对原有的类视图进行改写,继承ListCreateAPIView,同时重写get_serializer_class方法

示例代码(注意错误地方):

from rest_framework.generics import ListCreateAPIView
from meiduo_admin.serializers.user import UserSerializer, UserAddSerializer
from meiduo_admin.utils import UserPageNum
from users.models import User


class UserView(ListCreateAPIView):
    # 指定使用的序列化器
    serializer_class = UserSerializer
    # 指定分页器
    pagination_class = UserPageNum

    #  根据不同的请求返回不同的序列化器
    # def get_serializer_class(self):
    #     # 请求方式是GET,则是获取用户数据返回UserSerializer
    #     if self.request.method == 'GET':
    #         return UserSerializer
    #     else:
    #         # POST请求,完成保存用户,返回UserAddSerializer
    #         return UserAddSerializer

    # 重写get_queryset方法,根据前端是否传递keyword值返回不同查询结果
    def get_queryset(self):
        # 获取前端传递的keyword值
        keyword = self.request.query_params.get('keyword')
        # 如果keyword是空字符,则说明要获取所有用户数据
        if keyword is '' or keyword is None:
            return User.objects.all()
        else:
            return User.objects.filter(username=keyword)  # 获取单一用户数据,这儿也可以使用模糊查询:username__contains=keyword

增加用户时,如果不修改保存数据的序列化器,此时数据库中保存的密码为空

 继续优化代码:

from rest_framework.generics import ListCreateAPIView
from meiduo_admin.serializers.user import UserSerializer, UserAddSerializer
from meiduo_admin.utils import UserPageNum
from users.models import User


class UserView(ListCreateAPIView):
    # 指定使用的序列化器
    # serializer_class = UserSerializer
    # 指定分页器
    pagination_class = UserPageNum

    #  根据不同的请求返回不同的序列化器
    def get_serializer_class(self):
        # 请求方式是GET,则是获取用户数据返回UserSerializer
        if self.request.method == 'GET':
            return UserSerializer
        else:
            # POST请求,完成保存用户,返回UserAddSerializer
            return UserAddSerializer

    # 重写get_queryset方法,根据前端是否传递keyword值返回不同查询结果
    def get_queryset(self):
        # 获取前端传递的keyword值
        keyword = self.request.query_params.get('keyword')
        # 如果keyword是空字符,则说明要获取所有用户数据
        if keyword is '' or keyword is None:
            return User.objects.all()
        else:
            return User.objects.filter(username=keyword)  # 获取单一用户数据,这儿也可以使用模糊查询:username__contains=keyword
class UserAddSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'mobile', 'email', 'password')  # id是默认有read_only=True属性的
        # username字段增加长度限制,password字段只参与保存,不在返回给前端,增加write_only选项参数
        extra_kwargs = {
            'username': {
                'max_length': 20,
                'min_length': 5
            },
            'password': {
                'max_length': 20,
                'min_length': 8,
                'write_only': True

            },
        }

此时增加了保存数据的序列化器,但是仍然存在问题,保存的数据库中的密码没有加密,如下所示

指定序列化器:

from rest_framework import serializers
from users.models import User


class UserAddSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'mobile', 'email', 'password')  # id是默认有read_only=True属性的
        # username字段增加长度限制,password字段只参与保存,不在返回给前端,增加write_only选项参数
        extra_kwargs = {
            'username': {
                'max_length': 20,
                'min_length': 5
            },
            'password': {
                'max_length': 20,
                'min_length': 8,
                'write_only': True

            },
        }

    # 重写create方法1
    def create(self, validated_data):
        # 保存用户数据并对密码加密
        user = User.objects.create_user(**validated_data)
        return user

    # 重写create方法2
    # def create(self, validated_data):
    #     user = super().create(validated_data)
    #     #  密码加密
    #     user.set_password(validated_data['password'])
    #     user.save()
    #     return user

序列化器中还可以增加手机号验证:

from rest_framework import serializers
from users.models import User
import re


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'mobile', 'email')


class UserAddSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'mobile', 'email', 'password')  # id是默认有read_only=True属性的
        # username字段增加长度限制,password字段只参与保存,不在返回给前端,增加write_only选项参数
        extra_kwargs = {
            'username': {
                'max_length': 20,
                'min_length': 5
            },
            'password': {
                'max_length': 20,
                'min_length': 8,
                'write_only': True

            },
        }
        
    #  手机号验证
    def validate_mobile(self, value):
        if not re.match(r'1[3-9]\d{9}', value):
            raise serializers.ValidationError('手机号格式不正确')
        return value
        
    # 重写create方法1
    def create(self, validated_data):
        # 保存用户数据并对密码加密
        user = User.objects.create_user(**validated_data)
        return user

    # 重写create方法2
    # def create(self, validated_data):
    #     user = super().create(validated_data)
    #     #  密码加密
    #     user.set_password(validated_data['password'])
    #     user.save()
    #     return user
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值