在 Django 中,如何编写一个查询,按一周中的特定日期过滤日期列?

问题描述

我使用的是 Python 3.9、Django 3.1 和 PostGres 10。我有以下查询来提供在特定日期范围内创建的文章...

    qset = Article.objects.filter(
        created_day__gte=start_date,created_day__lte=end_date
    )
    

我想添加的是一个子句,用于指定在特定日期(例如星期一)创建的日期范围内创建的文章数量,其中一周中的天数由整数表示( 0 = 星期一,1 = 星期二,... 6 = 星期日)。如何添加一个也可以按星期几过滤的子句?

解决方法

在问题中出现的代码块之后。

您可以通过执行以下操作进一步过滤 qset:

monday_qset = qset.objects.filter(created_day__week_day=2)

从 1(星期日)到 7(星期六)的星期几。

您可以找到有关 this lookup here on django docs.

的更多详细信息 ,

我们可以使用 ExtractWeekDay() (Django-Docs) 和 Count()

from django.db.models.functions import ExtractWeekDay
from django.db.models import Count


qset = Article.objects.filter(
    created_day__gte=start_date,created_day__lte=end_date
).annotate(
    week_day=ExtractWeekDay("created_day")
).values(
    "week_day"
).annotate(
    count=Count("pk")
).order_by("week_day")

输出将是这样的:

<QuerySet [
    {'count': 1098,'week_day': 2},{'count': 55,'week_day': 3},{'count': 29,'week_day': 4},{'count': 41,'week_day': 5},{'count': 25,'week_day': 6}
]>