django查詢今天,昨天,一周,分組統計月,年


一、概述

有一個用戶表,models.py內容如下:

from django.db import models

# Create your models here.
class User(models.Model):   #用戶名表
    username = models.CharField(max_length=16,verbose_name="用戶名")
    password = models.CharField(max_length=32,verbose_name="密碼")
    create_time = models.DateTimeField(auto_now_add=True,verbose_name="創建時間")
    last_time = models.DateTimeField(verbose_name="登錄時間")

    class Meta:
        # 多列唯一索引
        unique_together = ('username','create_time')

 

本文用的是sqlite3數據庫,插入初始數據,insert語句如下:

INSERT INTO "main"."application_user" ("id", "username", "password", "create_time", "last_time", "ROWID") VALUES (1, 'xiao1', 1234, '2020-01-01 13:14:52', '2020-01-01 13:14:52', 1);
INSERT INTO "main"."application_user" ("id", "username", "password", "create_time", "last_time", "ROWID") VALUES (2, 'xiao2', 1234, '2020-02-02 13:14:52', '2020-02-02 13:14:52', 2);
INSERT INTO "main"."application_user" ("id", "username", "password", "create_time", "last_time", "ROWID") VALUES (3, 'xiao3', 1234, '2020-03-03 13:14:52', '2020-03-03 13:14:52', 3);
INSERT INTO "main"."application_user" ("id", "username", "password", "create_time", "last_time", "ROWID") VALUES (4, 'xiao4', 1234, '2020-04-04 13:14:52', '2020-04-04 13:14:52', 4);
INSERT INTO "main"."application_user" ("id", "username", "password", "create_time", "last_time", "ROWID") VALUES (5, 'xiao5', 1234, '2020-05-05 13:14:52', '2020-05-05 13:14:52', 5);
INSERT INTO "main"."application_user" ("id", "username", "password", "create_time", "last_time", "ROWID") VALUES (6, 'xiao6', 1234, '2020-06-06 13:14:52', '2020-06-06 13:14:52', 6);
INSERT INTO "main"."application_user" ("id", "username", "password", "create_time", "last_time", "ROWID") VALUES (7, 'xiao7', 1234, '2020-07-07 13:14:52', '2020-07-07 13:14:52', 7);
INSERT INTO "main"."application_user" ("id", "username", "password", "create_time", "last_time", "ROWID") VALUES (8, 'xiao8', 1234, '2020-07-23 13:14:52', '2020-07-22 13:14:52', 8);
INSERT INTO "main"."application_user" ("id", "username", "password", "create_time", "last_time", "ROWID") VALUES (9, 'xiao9', 1234, '2020-07-24 13:14:52', '2020-07-22 13:14:52', 9);

 

需求如下:

1. 查詢今天,昨天,一周的用戶數。

2. 最近一個月,分組統計每一天的數量

3. 最近1年,分組統計每一個月的數量

 

二、項目演示

新建一個項目,名字為:test_rom,應用名稱為:application

django版本為:3.0.8

 

settings.py

修改時區,內容如下:

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False

 

urls.py

from django.contrib import admin
from django.urls import path
from application import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index),
    path('month/', views.month),
    path('year/', views.year),
]

 

views.py

from django.shortcuts import render
import datetime
from application import models
from django.http import JsonResponse
import time
from dateutil.relativedelta import relativedelta
from django.db.models.functions import TruncMonth,TruncYear,ExtractYear,ExtractMonth
from django.db.models import Count
from django.db import connection

# Create your views here.
def index(request):
    # 今日###############
    today = datetime.datetime.now().date()
    ret = models.User.objects.filter(create_time__gte=str(today) + ' 00:00:00')
    today_len = len(ret)

    # 昨天###############
    yesterday = (datetime.datetime.now() + datetime.timedelta(days=-1)).date()
    ret = models.User.objects.filter(create_time__gte=str(yesterday) + ' 00:00:00',
                                         create_time__lte=str(today) + ' 23:59:59')
    yesterday_len = len(ret)

    # 一周前
    today = datetime.datetime.now().date()
    weekdelta = datetime.datetime.now().date() - datetime.timedelta(weeks=1)
    ret = models.User.objects.filter(create_time__gte=str(weekdelta) + ' 00:00:00',
                                         create_time__lte=str(today) + ' 23:59:59')
    week_len = len(ret)

    # 總數量
    ret = models.User.objects.all()
    total_len = len(ret)

    data = {
        "today": today_len,
        "yesterday": yesterday_len,
        "week": week_len,
        "total": total_len
    }

    return JsonResponse(data)


def month(request):
    now = datetime.datetime.now()
    a_month = now - datetime.timedelta(days=50)
    select = {'day': 'date(create_time)'}
    count_data = models.User.objects. \
        filter(create_time__range=(a_month, now)). \
        extra(select=select).values('day').distinct().order_by("day").annotate(number=Count('create_time'))

    x_list = []
    y_list = []
    for i in count_data:
        x_list.append(i['day'])
        y_list.append(i['number'])

    data = {"x": x_list, "y": y_list}
    return JsonResponse(data)


def year(request):
    # 計算時間
    time_ago = datetime.datetime.now() - relativedelta(years=1)
    # print("time_ago",time_ago)
    # 獲取近一年數據
    one_year_data = models.User.objects.filter(create_time__gte=time_ago)
    # 分組統計每個月的數據
    count_res = one_year_data \
        .annotate(year=ExtractYear('create_time'), month=ExtractMonth('create_time')) \
        .values('year', 'month').order_by('year', 'month').annotate(count=Count('id'))

    # 封裝數據格式
    month_list = []
    count_list = []
    for i in count_res:
        month_list.append("%s-%s" % (i['year'], i['month']))
        count_list.append(i["count"])

    data = {"month": month_list, "count": count_list}
    return JsonResponse(data)
View Code

 

啟動並訪問

使用Pycharm直接啟動即可,訪問首頁:

http://127.0.0.1:8001/index/

效果如下:

 

 

訪問最近一個月分組數據

http://127.0.0.1:8001/month/

效果如下:

 

 

訪問最近一年的分組數據

http://127.0.0.1:8001/year/

效果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM