增加用户
请求方式:POST /meiduo_admin/users/
#-------用户管理---------
url(r'^users/$',users.UserView.as_view()),
请求参数: 通过请求头传递jwt token数据。
参数类型是否必须说明usernamestr是用户名mobilestr是手机号passwordint是密码emailstr否邮箱返回数据: JSON
{
"id": "用户id",
"username": "用户名",
"mobile": "手机号",
"email": "邮箱"
}
返回值类型是否必须说明idint是用户idusernamestr是用户名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