Django ORM实现按天获取数据去重求和例子


Posted in Python onMay 18, 2020

我就废话不多说了,大家还是直接看代码吧!

def total_data(request):
  data = request_body(request, 'POST')
  if not data:
    return http_return(400, '参数错误')
  # 前端传入毫秒为单位的时间戳
  startTimestamp = data.get('startTime', '')
  endTimestamp = data.get('endTime', '')

  if startTimestamp and endTimestamp:
    startTimestamp = int(startTimestamp/1000)
    endTimestamp = int(endTimestamp/1000)
  else:
    return http_return(400, '参数有误')
  # 小于2019-05-30 00:00:00的时间不合法
  if endTimestamp < startTimestamp or endTimestamp <= 1559145600 or startTimestamp <= 1559145600:
    return http_return(400, '无效时间')
  if startTimestamp and endTimestamp:
    # 给定时间查询
    startTime = datetime.fromtimestamp(startTimestamp)
    endTime = datetime.fromtimestamp(endTimestamp)
    t1 = datetime(startTime.year, startTime.month, startTime.day)
    t2 = datetime(endTime.year, endTime.month, endTime.day, 23, 59, 59, 999999)
    # 用户总人数
    totalUsers = User.objects.exclude(status='destroy').count()
    # 音频总数
    totalAudioStory = AudioStory.objects.filter(isDelete=False).count()
    # 专辑总数
    totalAlbums = Album.objects.filter(isDelete=False).count()
    # 新增用户人数
    newUsers = User.objects.filter(createTime__range=(t1, t2)).exclude(status='destroy').count()
    # 活跃用户人数
    activityUsers = LoginLog.objects.filter(createTime__range=(t1, t2), isManager=False).values('userUuid_id').\
      annotate(Count('userUuid_id')).count()
    # 新增音频数
    newAudioStory = AudioStory.objects.filter(createTime__range=(t1, t2)).count()

    # 男性
    male = User.objects.filter(gender=1).exclude(status='destroy').count()

    # 女性
    female = User.objects.filter(gender=2).exclude(status='destroy').count()

    # 未知
    unkonwGender = User.objects.filter(gender=0).exclude(status='destroy').count()


    # 模板音频
    aduioStoryCount = AudioStory.objects.filter(
      isDelete=False, audioStoryType=1, isUpload=1, createTime__range=(t1, t2)).count()

    # 自由录制
    freedomStoryCount = AudioStory.objects.filter(
      isDelete=False, audioStoryType=0, isUpload=1, createTime__range=(t1, t2)).count()

    # 儿歌
    tags1 = Tag.objects.filter(code="RECORDTYPE", name='儿歌').first()
    tags1Count = tags1.tagsAudioStory.filter(isDelete=False, createTime__range=(t1, t2)).count()   # 儿歌作品数
    user1Count = tags1.tagsAudioStory.filter(isDelete=False, createTime__range=(t1, t2)).\
      values('userUuid_id').annotate(Count('userUuid_id')).count()                # 录音类型人数,去重

    # result = Tag.objects.filter(code="RECORDTYPE").annotate(Count('tagsAudioStory'))

    # 父母学堂
    tags2 = Tag.objects.filter(code="RECORDTYPE", name='父母学堂').first()
    tags2Count = tags2.tagsAudioStory.filter(isDelete=False, createTime__range=(t1, t2)).count()
    user2Count = tags2.tagsAudioStory.filter(isDelete=False, createTime__range=(t1, t2)).\
      values('userUuid_id').annotate(Count('userUuid_id')).count()

    # 国学
    tags3 = Tag.objects.filter(code="RECORDTYPE", name='国学').first()
    tags3Count = tags3.tagsAudioStory.filter(isDelete=False, createTime__range=(t1, t2)).count()
    user3Count = tags3.tagsAudioStory.filter(isDelete=False, createTime__range=(t1, t2)).\
      values('userUuid_id').annotate(Count('userUuid_id')).count()

    # 英文
    tags4 = Tag.objects.filter(code="RECORDTYPE", name='英文').first()
    tags4Count = tags4.tagsAudioStory.filter(isDelete=False, createTime__range=(t1, t2)).count()
    user4Count = tags4.tagsAudioStory.filter(isDelete=False, createTime__range=(t1, t2)). \
      values('userUuid_id').annotate(Count('userUuid_id')).count()

    # 其他
    tags5 = Tag.objects.filter(code="RECORDTYPE", name='其他').first()
    tags5Count = tags5.tagsAudioStory.filter(isDelete=False, createTime__range=(t1, t2)).count()
    user5Count = tags5.tagsAudioStory.filter(isDelete=False, createTime__range=(t1, t2)).\
      values('userUuid_id').annotate(Count('userUuid_id')).count()

    recordTypePercentage = [
      {'name': '儿歌', 'tagsNum': tags1Count, 'userNum': user1Count},
      {'name': '儿歌', 'tagsNum': tags2Count, 'userNum': user2Count},
      {'name': '国学', 'tagsNum': tags3Count, 'userNum': user3Count},
      {'name': '英文', 'tagsNum': tags4Count, 'userNum': user4Count},
      {'name': '其他', 'tagsNum': tags5Count, 'userNum': user5Count}
    ]

    # 活跃用户排行
    data1_list = []
    # result = AudioStory.objects.filter(isDelete=False, createTime__range=(t1, t2)).values('userUuid_id').annotate(Count('userUuid_id'))[:1]
    res = User.objects.annotate(audioStory_count_by_user = Count("useAudioUuid")).order_by('-audioStory_count_by_user')[:5]
    for index,item in enumerate(res.values()):
      data = {
        'orderNum': index+1,
        'name': item['nickName'],
        'recordCount': item['audioStory_count_by_user']
      }
      data1_list.append(data)
    # 热门录制排行
    data2_list = []
    res = Story.objects.filter(status="normal", createTime__range=(t1, t2)).order_by('-recordNum')[:5]
    for index,item in enumerate(res.values()):
      data = {
        'orderNum': index + 1 or -1,
        'name': item['name'] or '',
        'recordNum': item['recordNum'] or 0
      }
      data2_list.append(data)

    # 热门播放排行
    data3_list = []
    audioStory = AudioStory.objects.filter(isDelete=False, createTime__range=(t1, t2)).order_by('-playTimes')[:5]
    for index,item in enumerate(audioStory):
      data = {
        'orderNum': index + 1,
        'name': item.storyUuid.name if item.audioStoryType else item.name,
        'playTimes': item.playTimes
      }
      data3_list.append(data)

    # 图表数据--新增用户
    graph1 = User.objects.filter(createTime__range=(t1, t2)).\
      extra(select={"time": "DATE_FORMAT(createTime,'%%Y-%%m-%%e')"}).\
      order_by('time').values('time')\
      .annotate(userNum=Count('createTime')).values('time', 'userNum')
    if graph1:
      graph1 = list(graph1)
    else:
      graph1 = []

    # 活跃用户
    graph2 = LoginLog.objects.filter(createTime__range=(t1, t2), isManager=False). \
      extra(select={"time": "DATE_FORMAT(createTime,'%%Y-%%m-%%e')"}). \
      values('time').annotate(userNum=Count('createTime', distinct=True)).values('time', 'userNum')
    if graph2:
      graph2 = list(graph2)
    else:
      graph2 = []

    return http_return(200, 'OK',
              {
                'totalUsers': totalUsers,      # 总用户人数
                'totalAudioStory': totalAudioStory, # 音频总数
                'totalAlbums': totalAlbums,     # 总的专辑数
                'newUsers': newUsers,        # 新增用户人数
                'activityUsers': activityUsers,   # 活跃用户人数
                'newAudioStory': newAudioStory,   # 新增音频数
                'activityUsersRank': data1_list,   # 活跃用户排行
                'male': male,             # 男性
                'female': female,           # 女性
                'unkonwGender': unkonwGender,    # 未知性别
                'aduioStoryCount': aduioStoryCount, # 模板音频数量
                'freedomStoryCount': freedomStoryCount, # 自由录制音频数量
                'recordTypePercentage': recordTypePercentage,
                'hotRecordRank': data2_list,     # 热门录制排行
                'hotPlayAudioStoryRank': data3_list,   # 热门播放排行
                'newUserGraph': graph1,       # 新增用户折线图
                'activityUserGraph': graph2,     # 活跃用户折线图
              })

补充知识:Django 对符合条件的某个字段进行求和,聚合函数annotate()

开发环境:Ubuntu16.04+Django 1.11.9+Python2.7

对符合条件的某个字段求和 

之前在开发的时候,有同事问Django是否存在着这样的方法,可以直接将符合条件的某个字段直接求和.

当时不知道这样的方法是否存在,但是想了想自己解决这类似问题的方法,先用filter将符合条件的取出来,然后进行for循环,取出需要的字段,进行求和.感觉是挺low的,于是一起Baidu,写代码测试最后找到了可以求值的方法,聚合函数annotate().

from django.db.models import Sum
from models import Book
all_price = Book.objects.values('price').annotate(num_books=Sum('price')).filter(author='Yu')
print all_price[0]['num_books']

输出结果:650

上面的参数换个顺序,不会出错但不符合预期结果.

all_price = Book.objects.annotate(num_books=Sum('price')).filter(author='Yu').values('price')
print all_youxibi[0]['num_books']

输出结果:'nums_book'

以上这篇Django ORM实现按天获取数据去重求和例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python入门篇之字典
Oct 17 Python
Python中用startswith()函数判断字符串开头的教程
Apr 07 Python
详解python3中socket套接字的编码问题解决
Jul 01 Python
python计算两个地址之间的距离方法
Jun 09 Python
python tkinter界面居中显示的方法
Oct 11 Python
python环境路径配置以及命令行运行脚本
Apr 02 Python
python numpy之np.random的随机数函数使用介绍
Oct 06 Python
python实现七段数码管和倒计时效果
Nov 23 Python
使用Python求解带约束的最优化问题详解
Feb 11 Python
python高阶函数map()和reduce()实例解析
Mar 16 Python
Python实现Word表格转成Excel表格的示例代码
Apr 16 Python
解决pycharm修改代码后第一次运行不生效的问题
Feb 06 Python
如何实现更换Jupyter Notebook内核Python版本
May 18 #Python
python mysql自增字段AUTO_INCREMENT值的修改方式
May 18 #Python
Pycharm安装并配置jupyter notebook的实现
May 18 #Python
Django中的AutoField字段使用
May 18 #Python
jupyter notebook运行命令显示[*](解决办法)
May 18 #Python
jupyter notebook的安装与使用详解
May 18 #Python
Python读取JSON数据操作实例解析
May 18 #Python
You might like
PHP生成带有雪花背景的验证码
2006/10/09 PHP
php获取汉字拼音首字母的方法
2015/10/21 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
js网页版计算器的简单实现
2013/07/02 Javascript
javascript删除字符串最后一个字符
2014/01/14 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
关于ES6的六个小特性(二)
2017/02/20 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
通过实例讲解JS如何防抖动
2019/06/15 Javascript
jQuery/JS监听input输入框值变化实例
2019/10/17 jQuery
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
Python多进程同步Lock、Semaphore、Event实例
2014/11/21 Python
Python使用functools模块中的partial函数生成偏函数
2016/07/02 Python
python利用rsa库做公钥解密的方法教程
2017/12/10 Python
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
Django视图和URL配置详解
2018/01/31 Python
opencv python 2D直方图的示例代码
2018/07/20 Python
Python 读写文件的操作代码
2018/09/20 Python
Python os模块常用方法和属性总结
2020/02/20 Python
基于OpenCV的路面质量检测的实现
2020/11/04 Python
Python 列表反转显示的四种方法
2020/11/16 Python
微软新西兰官方网站:Microsoft New Zealand
2018/08/17 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
采购人员的个人自我评价
2014/01/16 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
导游词之天津古文化街
2019/11/09 职场文书
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers