DRF框架实战项目后台----首页数据的统计和显示所有用户


后台首页

  • 因为meiduo_admin后台项目只是一个子应用,创建views包和serializers包来存放视图类和序列化器类在这里插入图片描述

  • views包内创建home主页py文件写主页的视图类


用户日活跃数量

  • 分析前端请求:
    在这里插入图片描述

  • 代码

    # /statistical/day_active/   继承一级视图
    class UserDailyActiveCountView(APIView):
        # 设置权限只可以管理员访问  防止爬虫
        permission_classes = [IsAdminUser]
    
        def get(self, request):
            """
            日活人数数量统计
            :param request: 
            :return: 
            """
            # 获取当前时间
            today = date.today()
            # 如果用户最后登录的时间大于今天的0:00就说明今日登录了  计算今日所有登录过的用户的数量
            count = User.objects.filter(last_login__gte=today).count()
            # 返回数据
            return Response({'count': count})
    
    
  • 测试
    在这里插入图片描述


今日所有用户下单量

  • 分析前端请求:

    在这里插入图片描述

  • 代码:

    class UserDailyOrderCountView(APIView):
    permission_classes = [IsAdminUser]
    
    def get(self, request):
        """
        返回今日创建的订单数量
        :param request:
        :return:
        """
        # 获取今日时间
        today = date.today()
        # 查询订单表  把所有创建时间大于今日0:00的订单数量查询出来
        count = OrderInfo.objects.filter(create_time__gte=today).count()
        # 返回数据
        return Response({'count': count})
    
  • 测试:
    在这里插入图片描述
    在这里插入图片描述


今日新增用户数量

一个道理

class UserDailyIncrementCountView(APIView):
    permission_classes = [IsAdminUser]

    def get(self, request):
        """
        今日新增用户数量
        :param request: 
        :return: 
        """
        # 获取今日时间
        today = date.today()
        # 查询date_joined字段大于等于今日0:00所有用户数量
        count = User.objects.filter(date_joined__gte=today).count()

        return Response({'count': count})

一个月内每天的新增用户

  • 分析前端需要返沪的数据:

    在这里插入图片描述

  • 代码:

    class UserDailyMonthIncrementCountView(APIView):
        permission_classes = [IsAdminUser]
    
        def get(self, request):
            """
            本月新增用户数量
            :param request: 
            :return: 
            """
            # 定义三十天前的时间  今日时间减去30天
            start_date = date.today() - timedelta(days=31)
            # 组织前端需要的列表数据
            aList_all = []
            # 循环31次
            for i in range(32):
                # 当前时间为三十天前加上i天
                current_date = start_date + timedelta(days=i)
                # 当前时间的下一天
                next_date = start_date + timedelta(days=i + 1)
                # 每一次查询出大于等于今天时间创建的用户和小于明天时间创建的用户
                count = User.objects.filter(date_joined__gte=current_date, date_joined__lt=next_date).count()
                # 组织数据  数量和日期
                aList_all.append({
                    'count': count,
                    'date': current_date
                })
            # 返回数据
            return Response(aList_all)
    
    

用户管理页显示所有用户

  • 分析前端需要返回的数据:
    在这里插入图片描述

  • 用户相关,创建user.py文件存放用户相关的视图类
    在这里插入图片描述

  • 创建用户序列化器:
    在这里插入图片描述
    只设置需要的字段

    from rest_framework.serializers import ModelSerializer
    
    from apps.users.models import User
    
    
    class UserModelSerializer(ModelSerializer):
        class Meta:
        	# 指定模型类
            model = User
    		# 指定需要生成的字段
            fields = ['id', 'username', 'mobile', 'email']
    
    
  • 创建分页器,因为前端需要的数据需要自定义:

# 继承PageNumberPagination分页类
class PageNum(PageNumberPagination):
	# 重写一页返回多少数据
    page_size = 2
    # 重写前端传来的pagesize变量名
    page_size_query_param = 'pagesize'
    # 一页最多返回多少数据
    max_page_size = 20
	# 重写get_paginated_response方法来自定义返回数据,自动返回的数据不是我们前端想要的
	# data为数据
    def get_paginated_response(self, data):
    	# 返回前端需要的数据
        return Response(OrderedDict([
            ('pages', self.page.paginator.count),
            ('page', self.page.number),
            ('lists', data)
        ]))

  • 视图类代码:

    class UserListView(ListAPIView):
        # 只允许管理员用户访问
        permission_classes = [IsAdminUser]
        # queryset查询集  返回所有用户
        queryset = User.objects.all()
        # 指定序列化器
        serializer_class = UserModelSerializer
        # 指定分页器
        pagination_class = PageNum
    
  • 测试:

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值