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

时间:2012-06-26 10:12:46

标签: mysql django django-orm

我在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)

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

2 个答案:

答案 0 :(得分:20)

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

这应该可以解决问题:

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)

答案 1 :(得分:7)

查看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 Stackoverflow post):

from datetime import date, timedelta

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

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