用户管理/分页器指定
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 | 是 | 密码 |
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
壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下。清风徐来,水波不兴。举酒属客,诵明月之诗,歌窈窕之章。少焉,月出于东山之上,徘徊于斗牛之间。白露横江,水光接天。纵一苇之所如,凌万顷之茫然。浩浩乎如冯虚御风,而不知其所止;飘飘乎如遗世独立,羽化而登仙。
于是饮酒乐甚,扣舷而歌之。歌曰:“桂棹兮兰桨,击空明兮溯流光。渺渺兮予怀,望美人兮天一方。”客有吹洞箫者,倚歌而和之。其声呜呜然,如怨如慕,如泣如诉,余音袅袅,不绝如缕。舞幽壑之潜蛟,泣孤舟之嫠妇。
苏子愀然,正襟危坐而问客曰:“何为其然也?”客曰:“月明星稀,乌鹊南飞,此非曹孟德之诗乎?西望夏口,东望武昌,山川相缪,郁乎苍苍,此非孟德之困于周郎者乎?方其破荆州,下江陵,顺流而东也,舳舻千里,旌旗蔽空,酾酒临江,横槊赋诗,固一世之雄也,而今安在哉?况吾与子渔樵于江渚之上,侣鱼虾而友麋鹿,驾一叶之扁舟,举匏樽以相属。寄蜉蝣于天地,渺沧海之一粟。哀吾生之须臾,羡长江之无穷。挟飞仙以遨游,抱明月而长终。知不可乎骤得,托遗响于悲风。”
苏子曰:“客亦知夫水与月乎?逝者如斯,而未尝往也;盈虚者如彼,而卒莫消长也。盖将自其变者而观之,则天地曾不能以一瞬;自其不变者而观之,则物与我皆无尽也,而又何羡乎!且夫天地之间,物各有主,苟非吾之所有,虽一毫而莫取。惟江上之清风,与山间之明月,耳得之而为声,目遇之而成色,取之无禁,用之不竭,是造物者之无尽藏也,而吾与子之所共适。”
客喜而笑,洗盏更酌。肴核既尽,杯盘狼籍。相与枕藉乎舟中,不知东方之既白。