美多后台管理 第三天
今日需要包
from rest_framework.generics import ListAPIView
from rest_framework.views import APIView
from rest_framework.response import Response
from apps.goods.models import GoodsVisitCount
from apps.users.models import User
from datetime import datetime, date, timedelta
from rest_framework.permissions import IsAdminUser
from apps.meiduo_admin.serializers import statistical
今天知识点
- 登录
- 数据统计
- 用户管理
登录
- 问题1:自定义响应体
- drf-jwt包中的登录视图默认只返回token,而前端需要user_id,username
- 实现:1.自定义响应方法;2.配置
- 问题2:自定义载荷
- 思路:读文档
- 实现:1.自定义载荷方法;2.配置
- 问题3:自定义验证
- 思路:读源码
- 结论:drf-jwt的登录视图与前台登录使用同一个方法
- 路线:路由===》视图类===》post===》序列化器===》验证方法===》authenticate
- 实现:判断,查询,对比密码
- 提示:查询时加入is_staff=True条件
数据统计
用户总数统计
class 名称View(APIView)
#指定管理员权限
def get(self,request)
总数 = User.objects.filter(is_staff=Flase).count()
#看文档返回什么格式 以及数据
return Response({
'count':count,
'date':datetime.today()
});
日增用户统计
class 名称View(APIView):
def get(self,request):
# 统计今天注册的用户
today = date.today()# 年-月-日 0:0:0
# 条件:注册时间大于等于今天 date_joined 记录创建账户时间
count = User.objects.filter(date_joined__gte=today, is_staff=False).count()
#看文档返回什么格式 以及数据
return Response({
'count': count,
'date': today
})
日活跃用户
class 名称View(View):
def get(self,request):
# 日活跃用户
today = date.today()
# 条件:今天登录的用户
count = User.objects.filter(is_staff=False, last_login__gte=today).count()
return Response({
'count': count,
'date': today
})
日下单用户
class 名称View(View):
def get(self,request):
# 日下单用户量统计
today = date.today()
# 统计用户个数,条件是今天下过订单的用户
# 注意:在OrderInfo模型类中,为外键user添加参数related_name='orders',
# select count(*) from (select DISTINCT a.* from tb_users as a inner join tb_order_info b on a.id=b.user_id where b.create_time>='2019-11-24') b2
count = User.objects.filter(orders__create_time__gte=today).distinct().count()
return Response({
'count': count,
'date': today
})
月增用户
class 名称View(View):
def get(self,request):
# 月增用户统计
# 说明:统计最近一个月(30天)中每天新增的用户数量[{日期,数量},{},...]
count_list = []
today = date.today() # 2019-11-24
# for i in range(29,-1,-1):#[30,29,28,...]
for i in range(30):
date_begin = today - timedelta(days=29 - i) # 2019-10-26
date_end = date_begin + timedelta(days=1) # 2019-10-27
# 统计第i天注册的用户量
# 条件:大于当天0时0分0秒,小于第二天0时0分0秒
count = User.objects.filter(is_staff=False, date_joined__gte=date_begin, date_joined__lt=date_end).count()
count_list.append({
'count': count,
'date': date_begin
})
return Response(count_list)
日分类商品
方法①
class GoodsView(APIView):
def get(self, request):
# 日分类商品访问量:查询表中的数据,输出给客户端
today = date.today()
queryset = GoodsVisitCount.objects.filter(date=today)
# 遍历,将对象转字典
visit_list = []
for visit in queryset:
visit_list.append({
'category': visit.category.name,
'count': visit.count
})
# 响应
return Response(visit_list)
方法②
class GoodsView(ListAPIView):
queryset = GoodsVisitCount.objects.filter(date=date.today())
serializer_class = statistical.VisitSerializer
# statistical.py
from rest_framework import serializers
class VisitSerializer(serializers.Serializer):
category = serializers.StringRelatedField(read_only=True)
count = serializers.IntegerField()
查询
- 查询
- 定义视图类,继承
- 定义序列化器类,继承
- 配置路由规则
- 修改模板语言
- 过滤
- 1.接收:从查询参数中接收关键字
- 2.修改filter方法
- 说明:
- 如果需要从请求报文中获取数据,拼接条件则使用方法get_queryset()
- 如果不需要从请求报文中获取条件数据,则使用属性queryset
- 分页