用户管理/分页器指定

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  # 后端指定的页容量

        })

 

2.增加用户

接口分析

请求方式:POST /meiduo_admin/users/

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

参数类型是否必须说明
username str 用户名
mobile str 手机号
password int 密码
email str 邮箱

返回数据: JSON

 {
        "id": "用户id",
        "username": "用户名",
        "mobile": "手机号",
        "email": "邮箱"
    }
返回值类型是否必须说明
id int 用户id
username str 用户名
mobile str 手机号
email 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

 

posted @ 2020-08-14 03:36  sewen  Views(119)  Comments(0Edit  收藏  举报