如何在 django 中检索过去几周的记录
Posted
技术标签:
【中文标题】如何在 django 中检索过去几周的记录【英文标题】:How to retrieve records from past weeks in django 【发布时间】:2012-06-27 15:19:57 【问题描述】:我在 django 中遇到了如何检索上周(不是 7 天前)的数据的问题。使用date.isocalendar()[1]
会很棒。然而,一些***浏览导致我没有满意的结果。
无论如何,我可以在没有可移植性的情况下使用 mysql 的 INTERVAL
函数。这是我想使用 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 - 如何将数据与前几周的同一天进行比较?