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

xpa*_*nta 4 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)

我怎样才能使用extradjango中的函数(如果不可能以任何其他更简单的方式进行)?

mho*_*ost 22

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

这应该做的伎俩:

class Entry(models.Model):
    pub_date = models.DateField([...])
Run Code Online (Sandbox Code Playgroud)

获取对象:

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)
Run Code Online (Sandbox Code Playgroud)

请注意,我添加了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)
Run Code Online (Sandbox Code Playgroud)

代替:

from datetime import timedelta
from django.utils import timezone
some_day_last_week = timezone.now().date() - timedelta(days=7)
Run Code Online (Sandbox Code Playgroud)


Jen*_*ens 7

看看Django ORM 的过滤方法.

基本示例:

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

Entry.objects.filter(pub_date__year=2006)
Run Code Online (Sandbox Code Playgroud)

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

Entry.objects.filter(pub_date__gte=datetime.now())
Run Code Online (Sandbox Code Playgroud)

如您所见,您可以使用datetime其他python库来定义特定日期.查看字段查找的文档,了解您拥有哪些可能性.

在你的情况下,你可以做这样的事情(受此Stackoverflow帖子的启发):

from datetime import date, timedelta

d=date.today()-timedelta(days=7)
Entry.objects.filter(pub_date__gte=d)
Run Code Online (Sandbox Code Playgroud)

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

  • 它不起作用。`ValidationError: [u"'26' 值的格式无效。它必须采用 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 格式。"]` (2认同)