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 字符串格式化代码
Mar 17 Python
python利用hook技术破解https的实例代码
Mar 25 Python
在Python中使用NLTK库实现对词干的提取的教程
Apr 08 Python
Python实现的递归神经网络简单示例
Aug 11 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
Nov 21 Python
python之线程通过信号pyqtSignal刷新ui的方法
Jan 11 Python
网易2016研发工程师编程题 奖学金(python)
Jun 19 Python
python绘制多个子图的实例
Jul 07 Python
8种用Python实现线性回归的方法对比详解
Jul 10 Python
Django 实现Admin自动填充当前用户的示例代码
Nov 18 Python
Django生成数据库及添加用户报错解决方案
Oct 09 Python
在python中实现导入一个需要传参的模块
May 12 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
《魔兽世界》惊魂幻象将获得调整
2020/03/08 其他游戏
PHP最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
深入php 正则表达式的学习探讨
2013/06/06 PHP
基于JQUERY的两个ListBox子项互相调整的实现代码
2011/05/07 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
2013/01/20 Javascript
JavaScript中判断整数的多种方法总结
2014/11/08 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/06 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
原生JavaScript实现Ajax异步请求
2017/11/19 Javascript
vuejs router history 配置到iis的方法
2018/09/20 Javascript
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
javascript实现获取中文汉字拼音首字母
2020/05/19 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
python画柱状图--不同颜色并显示数值的方法
2018/12/13 Python
python实现智能语音天气预报
2019/12/02 Python
Python中itertools的用法详解
2020/02/07 Python
Python把图片转化为pdf代码实例
2020/07/28 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
汽车专业毕业生自荐信
2013/11/03 职场文书
小学生防溺水广播稿
2014/01/12 职场文书
警察先进个人事迹材料
2014/05/16 职场文书
2014年个人总结范文
2015/03/09 职场文书