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

In Django, how do I write a query that filters a date column by a specific day of the week?

我正在使用 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=<b>ExtractWeekDay("created_day")</b>
).values(
    <b>"week_day"</b>
).annotate(
    count=<b>Count("pk")</b>
).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}
]>