2015-12-27 2 views
1

Я хочу создать объект с DateTime 0000-00-00 00:00:00, поэтому, когда я проверяю даты в порядке ASC, сначала проверяются новые объекты.Как установить DateTimeField в ноль в Django?

+0

Почему вы не можете использовать значение null в базе данных? – GwynBleidD

+0

@GwynBleidD Нулевы ли значения сначала в ASC? – User

+0

Да, по умолчанию они на первом месте. – GwynBleidD

ответ

-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>] 

Так как вы можете видеть, Нуль- выходит последним в моей 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() явно указать, как вы хотите отсортировать NULLs:

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
  • Джанго 1.8.4
+0

Слова «вы должны использовать» велики. К сожалению, существует много устаревших систем, которые имеют схему с «0000-00-00». –

1

Для 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.

Смежные вопросы