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使用webbrowser浏览指定url的方法
Apr 04 Python
Python3.6简单的操作Mysql数据库的三个实例
Oct 17 Python
python面向对象入门教程之从代码复用开始(一)
Dec 11 Python
Python3实现的简单工资管理系统示例
Mar 12 Python
python中用logging实现日志滚动和过期日志删除功能
Aug 20 Python
python实现对变位词的判断方法
Apr 05 Python
将pycharm配置为matlab或者spyder的用法说明
Jun 08 Python
Django Form设置文本框为readonly操作
Jul 03 Python
详解python UDP 编程
Aug 24 Python
python 操作excel表格的方法
Dec 05 Python
scrapy-splash简单使用详解
Feb 21 Python
python中的装饰器该如何使用
Jun 18 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生成图片验证码、点击切换实例
2014/06/25 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
jquery ajax请求实例深入解析
2012/11/26 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
js获取checkbox值的方法
2015/01/28 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
vue-cli如何添加less 以及sass
2017/07/06 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
python如何读写json数据
2018/03/21 Python
python中删除某个元素的方法解析
2019/11/05 Python
Python对wav文件的重采样实例
2020/02/25 Python
如何基于Python实现word文档重新排版
2020/09/29 Python
canvas探照灯效果的示例代码
2018/11/30 HTML / CSS
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
环保倡议书
2014/04/14 职场文书
厕所文明标语
2014/06/11 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
2014年工商所工作总结
2014/12/09 职场文书
《假如》教学反思
2016/02/17 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
解读Vue组件注册方式
2021/05/15 Vue.js
vue2实现provide inject传递响应式
2021/05/21 Vue.js
室外天线与收音机天线杆接合方法
2022/04/05 无线电
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python