Django查询今天的所有项目

时间:2015-03-19 04:43:31

标签: django django-models django-queryset

我想查询并获取今天创建的所有页面。这是我的模特:

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())

除非我将字段更改为日期字段而不是日期时间字段,否则它不起作用。

6 个答案:

答案 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那里得到想法