Django筆記十七之group by 分組用法總結

XHunter發表於2023-04-08

本文首發於微信公眾號:Hunter後端
原文連結:Django筆記十七之group by 分組用法總結

這篇筆記介紹 Django 裡面 model 的 group by 對應的一些操作。

用到的 Model 如下:

class TestModel(models.Model):
    num = models.IntegerField()
    user_id = models.IntegerField()
    create_date = models.DateField()

我們寫入幾條資料:

TestModel.objects.create(num=78, user_id=1, create_date="2022-01-01")
TestModel.objects.create(num=99, user_id=1, create_date="2022-01-01")
TestModel.objects.create(num=87, user_id=1, create_date="2022-01-08")

TestModel.objects.create(num=66, user_id=2, create_date="2022-01-01")
TestModel.objects.create(num=54, user_id=2, create_date="2022-01-08")
TestModel.objects.create(num=77, user_id=2, create_date="2022-01-16")

本篇筆記的目錄如下:

  1. distinct 單個欄位
  2. distinct 多個欄位
  3. count 欄位去重後總數
  4. sum 某個欄位總和
  5. group by 分組統計 count
  6. group by 分組統計 max
  7. group by 分組統計 sum
  8. group by 分組統計 count + distinct

1、distinct 單個欄位

現在我們需要 user_id 這個欄位進行去重處理,獲取一個去重後的 user_id 的列表

使用 SQL 的話,大致如下:

select distinct user_id from blog_test;

使用 QuerySet 語句則是:

TestModel.objects.values_list("user_id", flat=True).distinct()

2、distinct 多個欄位

假設需要對 user_id 和 create_date 這兩個欄位做去重處理,

使用 SQL 語句如下:

select distinct user_id, create_date from blog_test;

對應的 QuerySet 語句:

TestModel.objects.values("user_id").distinct()

3、count 欄位去重後總數

比如我們想檢視 2022-01-01 這天有多少不同 user_id 值的資料

select count(distinct user_id) from blog_test where create_date = '2022-01-01';

對應的 QuerySet 為:

TestModel.objects.filter(create_date='2022-01-01').values("user_id").distinct().count()

4、sum 某個欄位總和

我們想檢視 2022-01-01 這天 num 欄位的資料的總和有多少:

select sum(num) from blog_test where create_date = '2022-01-01';

Django 語句:

from django.db.models import Sum

TestModel.objects.filter(create_date='2022-01-01').aggregate(sum_num=Sum('num'))

# 返回值為 
# {'sum_num': 243}

5、group by 分組統計 count

按照日期統計 user_id 的總數:

select create_date, count(user_id) from blog_test group by create_date;

Django 語句:

from django.db.models import Count

TestModel.objects.values("create_date").annotate(count=Count("user_id"))

6、group by 分組統計 max

按照日期計算每一天最大的 num 的資料:

select create_date, max(num) from blog_test group by create_date;

Django 語句:

TestModel.objects.values("create_date").annotate(max_num=Max("num"))

7、group by 分組統計 sum

按照日期計算 num 的總數:

select create_date, sum(num) from blog_test group by create_date;

Django 語句:

from django.db.models import Sum
TestModel.objects.values("create_date").annotate(sum_num=Sum("num"))

8、group by 分組統計 count + distinct

如果是對需要對 user_id 進行去重處理的統計,SQL 如下:

select create_date, count(distinct user_id) from blog_test group by create_date;

Django 語句:

TestModel.objects.values("create_date").annotate(count=Count("user_id", distinct=True))

以上就是本篇筆記全部內容,接下來會是幾個深入一點的知識點的介紹,比如一個 Model 示例 save() 方法的繼承和修改、主鍵自增和欄位更新的操作。

如果想獲取更多相關文章,可掃碼關注閱讀:
image