如何在Django中将DateTimeField设置为零?

时间:2015-12-27 23:13:07

标签: django

我想创建一个日期时间为0000-00-00 00:00:00的对象,所以当我按照ASC顺序检查日期时,会先检查新对象。

3 个答案:

答案 0 :(得分:3)

对于django 1.9,请使用以下字段:

from django.db import models  

class NullDateTimeField(models.DateTimeField):
    def get_db_prep_value(self, value, connection, prepared=False):
        # Casts datetimes into the format expected by the backend
        if not prepared:
            value = self.get_prep_value(value)

        # Use zeroed datetime instead of NULL
        if value is None:
            return  "0000-00-00 00:00:00"
        else:
            return connection.ops.adapt_datetimefield_value(value)

基于django DateTimeField source

答案 1 :(得分:0)

您想要的是“时代”:

时间戳记日期,时间戳记1970-01-01 00:00:00 + 00(Unix系统时间为零)

答案 2 :(得分:-1)

除非0000-00-00 00:00:00日期对您有意义,否则您不应将其用作特殊的"值。你应该使用NULL,例如

但是,我并不认为在评论中有一些关于在默认情况下以升序排序首先出现的NULL的说法是正确的,因为,让我们试试这样的模型:

class Log(Model):                                                                                                           
    timestamp = DateTimeField(null=True, default=None)                                                                      

    def __str__(self):                                                                                                      
        return str(self.timestamp) 

我创建了该类的一些对象:

In [21]: Log.objects.all()
Out[21]: [<Log: None>, <Log: 2015-12-28 12:33:17.464426>, <Log: 2015-12-28 12:35:52.313617>, <Log: None>]

上面没有排序,所以它们在数据库中以基数顺序出现。

这是ASC排序:

In [22]: Log.objects.order_by('timestamp')                                                                                  
Out[22]: [<Log: 2015-12-28 12:33:17.464426>, <Log: 2015-12-28 12:35:52.313617>, <Log: None>, <Log: None>]

正如您所看到的,NULL在我的ASC排序中最后出现。我正在使用PostgreSQL进行此测试。

这是DSC分类:

In [23]: Log.objects.order_by('-timestamp')
Out[23]: [<Log: None>, <Log: None>, <Log: 2015-12-28 12:35:52.313617>, <Log: 2015-12-28 12:33:17.464426>]

但是,您可以使用extra()明确指定对NULL的排序方式:

In [24]: Log.objects.extra(select={'timestamp_is_null': "timestamp is NULL"}, order_by=['-timestamp_is_null', 'timestamp'])
Out[24]: [<Log: None>, <Log: None>, <Log: 2015-12-28 12:33:17.464426>, <Log: 2015-12-28 12:35:52.313617>]

这里的代码片段更具可读性

Log.objects.extra(
    select={'timestamp_is_null': "timestamp is NULL"},
    order_by=['-timestamp_is_null', 'timestamp']
)

此测试的版本:

  • PostgreSQL 9.4.5
  • Django 1.8.4