Python实现日周月排行榜

Python根据当前时间实现日周月排行榜

前言

根据各种时间模块和Python内置函数实现,换算的步骤比较简单,逻辑比较多,仅供参考。

代码

写的比较喽,参考下思路就好,测试过,功能都能实现,自己可以去优化,用redis做下缓存处理就好。这是用Django框架实现的。直接怼代码!
import calendar
import time
from datetime import datetime, timedelta, date
import datetime
from django.db.models import Q, Sum
from rest_framework.response import Response
from rest_framework.views import APIView
from trade.models import UserSettlementFee
from users.models import Users


class RankingListView(APIView):
    """排行榜"""
    def get(self, request):
        cycle_way = request.query_params.get('cycle_way')

        if cycle_way is None:
            return Response({'message': "查询失败,请稍后再试!"})

        rank_list = []
        if cycle_way == "day":
            # 日排行榜
            # time.strftime("%Y-%m-%d", time.localtime(time.time())) -- 获取当天的所有时间段(如:2018-10-23)
            query_set = UserSettlementFee.objects.filter(date=time.strftime("%Y-%m-%d", time.localtime(time.time())))

            for qs in query_set:
                total_fee = qs.total_fee
                self_fee = qs.self_fee
                user_id = qs.user_id
                ztotal_fee = (total_fee + self_fee) * 1000

                user = Users.objects.get(id=user_id)
                bossuid = user.bossuid
                invit = user.invit
                moble = user.moble

                data = {
                    "ztotal_fee": ztotal_fee,
                    "bossuid": bossuid,
                    "invit": invit,
                    "mobile": str(moble).replace(str(moble)[3:6], "****")
                }
                rank_list.append(data)

        elif cycle_way == "week":
            # 周排行榜
            # time.strftime("%Y-%m-%d", time.localtime((time.mktime(datetime.strptime(str(datetime.now() - timedelta(days=datetime.now().weekday())).split()[0],"%Y-%m-%d").timetuple()))  -- 获取的是这周的周一的时间
            timestamp1 = time.strftime("%Y-%m-%d", time.localtime((time.mktime(datetime.strptime(str(datetime.now() - timedelta(days=datetime.now().weekday())).split()[0], "%Y-%m-%d").timetuple())) - 24*2*60*60)).split("-")
            timestamp2 = time.strftime("%Y-%m-%d", time.localtime((time.mktime(datetime.strptime(str(datetime.now() - timedelta(days=datetime.now().weekday())).split()[0], "%Y-%m-%d").timetuple())) + 24*5*60*60)).split("-")
            query_set = UserSettlementFee.objects.filter(Q(date__gt=date(int(timestamp1[0]), int(timestamp1[1]), int(timestamp1[2]))) &Q(date__lt=date(int(timestamp2[0]), int(timestamp2[1]), int(timestamp2[2]))))

            for qs in query_set:
                user_id = qs.user_id
                total_fee = UserSettlementFee.objects.filter(user_id=user_id).aggregate(Sum('total_fee'))
                self_fee = UserSettlementFee.objects.filter(user_id=user_id).aggregate(Sum('self_fee'))

                user = Users.objects.get(id=user_id)
                bossuid = user.bossuid
                invit = user.invit
                moble = user.moble

                data = {
                    "ztotal_fee": (total_fee['total_fee__sum'] + self_fee['self_fee__sum']) * 1000,
                    "bossuid": bossuid,
                    "invit": invit,
                    "mobile": str(moble).replace(str(moble)[3:6], "****")
                }
                rank_list.append(data)

        elif cycle_way == 'month':
            # 月排行榜
            t = time.localtime()
            week, month_day = calendar.monthrange(t.tm_year, t.tm_mon - 1)  # 获取当前对应的星期几和月份天数
            today = datetime.datetime.now()  # 获取当前时间
            offset = datetime.timedelta(days=-month_day)  # 计算偏移量
            re_date = ((today + offset).strftime('%Y-%m-%d')).split("-")
            query_set = UserSettlementFee.objects.filter(Q(date__gt=date(int(re_date[0]), int(re_date[1]), int(re_date[2]))) & 			Q(date__lt=date(t.tm_year, t.tm_mon, t.tm_mday)))

            for qs in query_set:
                user_id = qs.user_id
                total_fee = UserSettlementFee.objects.filter(user_id=user_id).aggregate(Sum('total_fee'))
                self_fee = UserSettlementFee.objects.filter(user_id=user_id).aggregate(Sum('self_fee'))

                user = Users.objects.get(id=user_id)
                bossuid = user.bossuid
                invit = user.invit
                moble = user.moble

                data = {
                    "ztotal_fee": (total_fee['total_fee__sum'] + self_fee['self_fee__sum']) * 1000,
                    "bossuid": bossuid,
                    "invit": invit,
                    "mobile": str(moble).replace(str(moble)[3:6], "****")
                }
                rank_list.append(data)
         else:
       		return Response({"data": "数据查询出错,请稍后再试!", "count": 0})
       		
        rank_list = sorted(rank_list, key=lambda x: x['ztotal_fee'], reverse=True)
        return Response({"data": rank_list, "count": len(rank_list)})

模型类

class UserSettlementFee(models.Model):
    """交易费率"""
    create_at = models.DateTimeField(auto_now=True, verbose_name='创建时间')
    total_fee = models.DecimalField(max_digits=20, decimal_places=4, verbose_name='交易费率')
    date = models.DateField(max_length=25, verbose_name='日期')
    user_id = models.IntegerField(verbose_name='用户ID')
    data = models.CharField(max_length=255, verbose_name='买/卖费率当日总额')
    self_fee = models.DecimalField(max_digits=20, decimal_places=4, verbose_name='自买自卖费率')
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值