4 - 用户管理
在用户页面我们需要完成两个功能:
1、用户信息的查询获取
2、增加用户
4.1.用户的查询获取
接口分析
请求方式:GET /meiduo_admin/users/?keyword=<搜索内容>&page=<页码>&pagesize=<页容量>
请求参数: 通过请求头传递jwt token数据。
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
keyword | str | 否 | 搜索用户名 |
page | int | 否 | 页码 |
pagesize | int | 否 | 页容量 |
返回数据: JSON
{
"counts": "用户总量",
"lists": [
{
"id": "用户id",
"username": "用户名",
"mobile": "手机号",
"email": "邮箱"
},
...
],
"page": "页码",
"pages": "总页数",
"pagesize": "页容量"
}
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
count | int | 是 | 用户总量 |
Lists | 数组 | 是 | 用户信息 |
page | int | 是 | 页码 |
pages | int | 是 | 总页数 |
pagesize | int | 是 | 页容量 |
后端实现
from rest_framework.generics import ListAPIView
from meiduo_admin.serializers.user import UserSerializer
from meiduo_admin.utils.pagenum import PageNum
from users.models import User
class UserView(ListAPIView):
# 指定使用的序列化器
serializer_class = UserSerializer
# 指定分页器
pagination_class = PageNum
# 重写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)
指定序列化器:
from rest_framework import serializers
from users.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model=User
fields=('id','username','mobile','email')
指定分页器:
class UserPageNum(PageNumberPagination):
page_size = 5 # 后端指定每页显示数量
page_size_query_param = 'pagesize'
max_page_size = 10
# 重写分页返回方法,按照指定的字段进行分页数据返回
def get_paginated_response(self, data):
return Response({
'count': self.page.paginator.count, # 总数量
'lists': data, # 用户数据
'page' : self.page.number, # 当前页数
'pages' : self.page.paginator.num_pages, # 总页数
'pagesize':self.page_size # 后端指定的页容量
})
4.2.增加用户
接口分析
请求方式:POST /meiduo_admin/users/
请求参数: 通过请求头传递jwt token数据。
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
username | str | 是 | 用户名 |
mobile | str | 是 | 手机号 |
password | int | 是 | 密码 |
str | 否 | 邮箱 |
返回数据: JSON
{
"id": "用户id",
"username": "用户名",
"mobile": "手机号",
"email": "邮箱"
}
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | int | 是 | 用户id |
username | str | 是 | 用户名 |
mobile | str | 是 | 手机号 |
str | 是 | 邮箱 |
后端实现
from rest_framework.generics import ListCreateAPIView
from meiduo_admin.serializers.user import UserSerializer, UserAddSerializer
from meiduo_admin.utils.pagenum import PageNum
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 import serializers
from users.models import User
class UserAddSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'mobile', 'email', 'password')
# username字段增加长度限制,password字段只参与保存,不在返回给前端,增加write_only选项参数
extra_kwargs = {
'username': {
'max_length': 20,
'min_length': 5
},
'password': {
'max_length': 20,
'min_length': 8,
'write_only': True
},
}
# 重写create方法
def create(self, validated_data):
# 保存用户数据并对密码加密
user = User.objects.create_user(**validated_data)
return user