如何在 django 中检索过去几周的记录

Posted

技术标签:

【中文标题】如何在 django 中检索过去几周的记录【英文标题】:How to retrieve records from past weeks in django 【发布时间】:2012-06-27 15:19:57 【问题描述】:

我在 django 中遇到了如何检索上周(不是 7 天前)的数据的问题。使用date.isocalendar()[1] 会很棒。然而,一些***浏览导致我没有满意的结果。

无论如何,我可以在没有可移植性的情况下使用 mysqlINTERVAL 函数。这是我想使用 django 的 ORM 进行的查询。

SELECT id, user_id, CAST(timestamp AS Date), WEEK(timestamp,3), WEEK(CURDATE(), 3) FROM main_userstats WHERE week(timestamp, 3) = WEEK(DATE_SUB(CURDATE(), INTERVAL 1 WEEK ), 3)

如何使用 django 中的 extra 函数来执行此操作(如果无法以任何其他更简单的方式执行此操作)?

【问题讨论】:

我只是说,这曾经在 Django 中让我很沮丧,我不得不选择切换到 Ruby,所以我做了并且没有回头:而不是:Entry.objects.filter(pub_date__gte=timezone.now().date()-timedelta(days=7)) You写:Entry.where( :pub_date.gte => 7.days.ago ) 同样的语法也适用于 SQL 类型的数据库和 MongoDB,这太棒了。 【参考方案1】:

我假设您要查找的是属于前一周同一日历周的所有条目。

这应该可以解决问题:

class Entry(models.Model):
    pub_date = models.DateField([...])

获取对象:

from datetime import timedelta
from django.utils import timezone
some_day_last_week = timezone.now().date() - timedelta(days=7)
monday_of_last_week = some_day_last_week - timedelta(days=(some_day_last_week.isocalendar()[2] - 1))
monday_of_this_week = monday_of_last_week + timedelta(days=7)
Entry.objects.filter(created_at__gte=monday_of_last_week, created_at__lt=monday_of_this_week)

请注意,我添加了 7 天来获取本周的星期一,而不是添加 6 天来获取上周的星期日,并且我使用了 created_at__lt=monday_of_this_week(而不是 __lte=)。我这样做是因为如果您的 pub_date 是 DateTimeField,它不会包含星期日对象,因为使用 now().date() 时的时间是 00:00:00。

这可以很容易地调整为将星期日视为一周的第一天,但​​ isocalendar() 认为它是最后一天,所以我同意了。

如果使用 Django

from datetime import date, timedelta
some_day_last_week = date.today() - timedelta(days=7)

代替:

from datetime import timedelta
from django.utils import timezone
some_day_last_week = timezone.now().date() - timedelta(days=7)

【讨论】:

【参考方案2】:

看看Django ORM的filter方法。

基本示例:

class Entry(models.Model):
  pub_date = models.DateField([...])

Entry.objects.filter(pub_date__year=2006)

但您可以使用以下过滤器进行更复杂的查询:

Entry.objects.filter(pub_date__gte=datetime.now())

如您所见,您可以使用datetime 和其他python 库来定义特定日期。查看field lookups 的文档,了解您有哪些可能性。

在你的情况下,你可以做这样的事情 (inspired by this *** post):

from datetime import date, timedelta

d=date.today()-timedelta(days=7)
Entry.objects.filter(pub_date__gte=d)

我不能 100% 确定此查找是否有效,但这是正确的方向。

【讨论】:

谢谢,我知道如何使用filter 方法。而且我也知道,虽然我可以按年或月过滤,但我不能按周过滤。我也想避免使用日期范围。 “周”是什么意思?您是指过去 7 天还是指日历中的最后一周? 我的意思是上一个日历周。这就是为什么我还提到datetime.idocalendar()[1] 非常好用。 你试过Entry.objects.filter(pub_date__gte=datetime.idocalendar()[1])吗? 它不起作用。 ValidationError: [u"'26' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."]【参考方案3】:

可以按周数week和iso_year查询数据

import datetime
date = datetime.datetime.today()
week = date.strftime("%V")

Entry.objects.filter(pub_date__week=week)
from django.utils.the timezone import now
year, week, _ = now().isocalendar()

Entry.objects.filter(pub_date__iso_year=year, pub_date__week=week)

【讨论】:

以上是关于如何在 django 中检索过去几周的记录的主要内容,如果未能解决你的问题,请参考以下文章

Excel中如何计算日期所在的这年的第几周,以周一作为一周的第一天

Kusto / Azure Application Insights - 如何将数据与前几周的同一天进行比较?

如何在 django 的自引用模型中优化相关记录的检索?

excel如何根据一系列日期数据(yyyymmdd)来统计当年的第几周的个数?

如何在红移中获取过去 X 周的数据?

如何将星期天设置为excel对周计算的第一天。