13

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

无论如何,我可以在没有可移植性的情况下使用 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)

我如何使用extradjango 中的函数来做到这一点(如果不可能以任何其他更简单的方式做到这一点)?

4

3 回答 3

34

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

这应该可以解决问题:

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 < 1.4,请使用以下内容:

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)
于 2012-10-01T22:48:12.513 回答
9

看Django ORM的过滤方法。

基本示例:

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 库来定义特定日期。查看有关字段查找的文档,以了解您有哪些可能性。

在您的情况下,您可以执行以下操作(受此 Stackoverflow 帖子的启发):

from datetime import date, timedelta

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

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

于 2012-06-26T10:36:56.163 回答
0

可以按周数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)
于 2022-01-20T12:52:02.460 回答