我在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
函数执行此操作(如果不可能以任何其他更简单的方式执行)?
答案 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%确定这个查找是否有效,但这是正确的方向。