如何才能筛选在Django一个DateTimeField字段的日期?(How can I filte

2019-06-18 18:41发布

我试图筛选DateTimeField与日期比较。 我的意思是:

MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))

我得到一个空的查询集列表作为答案,因为(我认为)我不考虑时间,但我希望“随时”。

是否有在Django一个简单的方法这样做的?

我有日期时间设置好的时候,它是不是00:00

Answer 1:

这样的查找在执行django.views.generic.date_based如下:

{'date_time_field__range': (datetime.datetime.combine(date, datetime.time.min),
                            datetime.datetime.combine(date, datetime.time.max))} 

因为它是非常详细有计划地提高使用的语法__date操作。 检查“ #9596比较一个DateTimeField字段的日期是太难 ”的更多细节。



Answer 2:

YourModel.objects.filter(datetime_published__year='2008', 
                         datetime_published__month='03', 
                         datetime_published__day='27')

//编辑点评后

YourModel.objects.filter(datetime_published=datetime(2008, 03, 27))

行得无法工作,因为它创建设置为0时间值的日期时间对象,因此在数据库中的时间不匹配。



Answer 3:

下面是我用的IPython的timeit功能得到了结果:

from datetime import date
today = date.today()

timeit[Model.objects.filter(date_created__year=today.year, date_created__month=today.month, date_created__day=today.day)]
1000 loops, best of 3: 652 us per loop

timeit[Model.objects.filter(date_created__gte=today)]
1000 loops, best of 3: 631 us per loop

timeit[Model.objects.filter(date_created__startswith=today)]
1000 loops, best of 3: 541 us per loop

timeit[Model.objects.filter(date_created__contains=today)]
1000 loops, best of 3: 536 us per loop

包含似乎更快。



Answer 4:

Mymodel.objects.filter(date_time_field__contains=datetime.date(1986, 7, 28))

以上是我用过的东西。 不仅它的工作原理,它也有一些固有的逻辑支持。



Answer 5:

现在Django的有__date查询集过滤器来查询针对开发版本日期datetime对象。 因此,它会在1.9即将上市。



Answer 6:

这将产生相同的结果作为使用__year,__month和__day,似乎为我工作:

YourModel.objects.filter(your_datetime_field__startswith=datetime.date(2009,8,22))


Answer 7:

由于Django的1.9,要做到这一点的方法是使用__date DateTime对象上。

例如: MyObject.objects.filter(datetime_attr__date=datetime.date(2009,8,22))



Answer 8:

假设active_on是日期对象,增加它1天然后执行范围

next_day = active_on + datetime.timedelta(1)
queryset = queryset.filter(date_created__range=(active_on, next_day) )


Answer 9:

这里有一个有趣technique--我利用了startswith程序与Django的实施在MySQL来实现的,只有通过唯一的日期查找日期时间的结果。 基本上,当Django的确实查找数据库中它必须做的DATETIME MySQL存储对象的字符串转换,因此你可以对过滤,留出的date--这样的%时间戳部分LIKE%仅日期匹配对象,你会得到每一个时间戳给定的日期。

datetime_filter = datetime(2009, 8, 22) 
MyObject.objects.filter(datetime_attr__startswith=datetime_filter.date())

这将执行以下查询:

SELECT (values) FROM myapp_my_object \ 
WHERE myapp_my_object.datetime_attr LIKE BINARY 2009-08-22%

在这种情况下,LIKE BINARY会的日期相匹配的一切,无论时间戳。 包括价值观,如:

+---------------------+
| datetime_attr       |
+---------------------+
| 2009-08-22 11:05:08 |
+---------------------+

希望这有助于大家直到Django自带了一个解决方案!



Answer 10:

嗯..我的解决办法是工作:

Mymodel.objects.filter(date_time_field__startswith=datetime.datetime(1986, 7, 28))


Answer 11:

看到这篇文章的Django文档

它非常类似于JZ答案

ur_data_model.objects.filter(ur_date_field=datetime(2005, 7, 27)


Answer 12:

Model.objects.filter(datetime__year=2011, datetime__month=2, datetime__day=30)


Answer 13:

在Django 1.7.6作品:

MyObject.objects.filter(datetime_attr__startswith=datetime.date(2009,8,22))


Answer 14:

还有,这里涵盖了这一个梦幻般的博文: 比较日期和日期时间在Django的ORM

最佳的解决方案张贴的Django> 1.7,<1.9是注册的变换:

from django.db import models

class MySQLDatetimeDate(models.Transform):
    """
    This implements a custom SQL lookup when using `__date` with datetimes.
    To enable filtering on datetimes that fall on a given date, import
    this transform and register it with the DateTimeField.
    """
    lookup_name = 'date'

    def as_sql(self, compiler, connection):
        lhs, params = compiler.compile(self.lhs)
        return 'DATE({})'.format(lhs), params

    @property
    def output_field(self):
        return models.DateField()

然后你就可以在你的过滤器像这样使用它:

Foo.objects.filter(created_on__date=date)

编辑

这个解决方案绝对是后端依赖。 从文章:

当然,这实现依赖于具有DATE()函数SQL您的特殊风味。 MySQL的一样。 所以做的SQLite。 在另一方面,我还没有在PostgreSQL工作个人,但一些谷歌上搜索使我相信,它并没有date()函数。 所以实现这个简单的好像它必然是有些后端依赖。



文章来源: How can I filter a date of a DateTimeField in Django?