我想查询并获取今天创建的所有页面。这是我的模特:
class Page(models.Model):
user = models.ForeignKey('User', related_name='pages', blank=True, null=True)
title = models.CharField(max_length=2000, default='', blank=True)
date_created = models.DateTimeField(default=datetime.datetime.now)
我试图像这样查询:
todays_pages = Page.objects.filter(date_created = datetime.date.today())
除非我将字段更改为日期字段而不是日期时间字段,否则它不起作用。
答案 0 :(得分:1)
您可以尝试这样:
todays_pages = Page.objects.filter(date_created__gte = datetime.date.now().replace(hour=0,minute=0,second=0))
答案 1 :(得分:1)
这就是我最终要做的事情。我不是要处理时区或任何事情,所以这很好。
today = datetime.date.today()
yesterday = today - datetime.timedelta(days=1)
todays_pages = Page.objects.filter(date_created__gt = today)[:25]
yesterdays_pages = Page.objects.filter(date_created__gt = yesterday, date_created__lt = today)[:25]
答案 2 :(得分:0)
您可以根据时间过滤对象。我这样做的方式是这样的......
today = datetime.date.today()
todays_pages = Page.objects.filter(date_created__range=[today,])
我没有专门尝试过这段代码,但这是我最好的猜测如何获取当前日历日的所有帖子。
答案 3 :(得分:0)
datetime.datetime.now()
是时区未发现的。您可能希望使用django.utils.timezone
进行转换。
答案 4 :(得分:0)
这看起来应该很容易,但事实上这主要是时区造成的一个非平凡的问题。您的DateTimeField
存储特定时间点。发生在哪个时间点的日期在不同的时区可能会有所不同 - 完全相同的时间点可能是柏林的周三早上,而是旧金山的周二晚。
根据您要查询的日期和时区,策略如下:
1)构建“该时区当天开始”的日期时间和“该时区当天结束时间”的日期时间。
2)查询开始日期和结束日期之间date_created
的网页。
在我最近写的一些代码中,我有一个combine
函数,用于将日期,时间和时区组合到日期时间中:
from django.utils import timezone
import pytz
def combine(adate, atime, tz=None, is_dst=None):
"""Turn a date and a time into a datetime in given timezone (or default).
The ``is_dst`` argument controls the handling of ambiguous datetimes
(e.g. during fall DST changeover), and nonexistent datetimes (e.g. during
spring DST changeover). If it is ``None`` (the default), these cases will
return ``None`` instead of a datetime. If it is ``True``, these cases will
be resolved by always assuming DST, and if ``False`` by assuming no-DST.
"""
tz = tz or timezone.get_current_timezone()
naive = dt(adate.year, adate.month, adate.day, atime.hour, atime.minute)
try:
return tz.normalize(tz.localize(naive, is_dst=is_dst))
except pytz.InvalidTimeError:
return None
然后您的查询如下所示:
def get_pages_created_on_date(for_date):
start = combine(for_date, time(0))
end = combine(for_date + datetime.timedelta(days=1), time(0))
return Page.objects.filter(date_created__gte=start, date_created__lt=end)
该版本只使用当前激活的时区(可能是Django设置文件中配置的时区,除非您为当前请求的用户激活本地时区做了一些额外的工作)。
我不知道DST过渡发生在午夜的任何时区,这应该使这段代码能够安全地抵御DST转换问题。但是如果有这样的时区,并且您可能需要在其中处理日期时间,那么您的查询函数需要将is_dst
标记传递给combine
。
如果您将today
传递给此查询,则还必须考虑如何为today
生成日期值。调用datetime.date.today()
将始终在服务器操作系统的本地时区提供今天的日期。这可能与您的Django设置时区或当前激活的Django时区不对应,这将导致查询无法给出正确的结果。要正确处理时区,您应该使用这样的today
函数:
from django.utils import timezone
def today():
return timezone.localtime(timezone.now()).date()
TL; DR:正确处理日期和时间很难。希望这可以帮助;祝你好运!
答案 5 :(得分:0)
from datetime import datetime
today = datetime.now()
current_day = Page.objects.filter(date_created__date=datetime.date(today))\
.values('category','name')
这对我有用
从https://docs.djangoproject.com/en/1.11/ref/models/querysets/#week那里得到想法