Django ORMは、日によってデータを取得して、その例を求めます。


余計なことを言わないで、コードを見てください。

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()
開発環境:Ubuntu 16.04+Django 1.11.9+Python 2.7
条件に該当するフィールドの合計を求めます。
前に開発した時、同僚がDjangoにこのような方法が存在しているかどうか聞いてきました。直接に条件に合うフィールドを直接に求めます。
このような方法があるかどうかは分かりませんでしたが、自分でこのような問題を解決する方法を考えて、まずfilterで条件に合ったものを取り出して、for循環を行い、必要なフィールドを取り出して、和睦を求めます。
from django.db.models import Sum
from models import Book
all_price=Book.object.values.annotate(num_)book s=Sum('price').filter(author='Yu')
print all_price[0][[num_]ブックス
出力結果:650
上記のパラメータは順序を変えます。間違いはありませんが、予期された結果に合わないです。
all_price=Book.objects.annotate(num_book s=Sum('price').filter(author='Yu').values('price')
print all_youxibi[0][num_]ブックス
出力結果:'nums_ブック
以上のこのDjango ORMは、毎日のデータ取得によって、その例として、小编が皆さんに提供しているすべての内容を重视することを実现しました。