在 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}
]>
我正在使用 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}
]>