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='自买自卖费率')