2012-04-06 2 views
9

У меня есть модель с поля даты и времени:Сравнить даты и DateTime в Django

class MyModel(models.Model): 
    created = models.DateTimeField(auto_now = True) 

Я хочу, чтобы получить все записи, созданные сегодня.

Я пробовал:

MyModel.objects.all().filter(created = timezone.now()) 

и

MyModel.objects.all().filter(created = timezone.now().date()) 

Но всегда есть пустое множество. Каков правильный способ в Django сделать это?

EDIT:

Это выглядит странно, но запись, созданная сегодня (06.04.2012 23:09:44) имеет дату (2012-04-07 04:09:44) в базе данных. Когда я пытаюсь отредактировать его в панели администратора, он выглядит правильно (06.04.2012 23:09:44). Разве Django справляется с этим?

+1

Похоже, вы бежите в проблемы часовых поясов. Согласно [documentation] (https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/) датам хранилища django с информацией о часовом поясе в формате UTC в базе данных. – mklauber

ответ

13

Там может быть более правильным решением, но быстрый обработка предполагает, что это будет работать:

from datetime import timedelta 

start_date = timezone.now().date() 
end_date = start_date + timedelta(days=1) 
Entry.objects.filter(created__range=(start_date, end_date)) 

Я предполагаю, что временная зона является DateTime-подобный объект.

Важно то, что вы храните точное время, вплоть до миллисекунды, и вы сравниваете его с тем, что имеет точность только в тот же день. Вместо того, чтобы бросать часы, минуты и секунды, django/python по умолчанию делает их равными 0. Поэтому, если ваша запись создается в 2011-4-6T06: 34: 14am, то она сравнивает 2011-4-6T: 06: 34: 14am до 2011-4-6T00: 00: 00, а не 2011-4-6 (с даты создания) до 2011-4-6 (из timezone.now(). date()). Полезно?

+0

Получил, что ... это выглядит странно, но запись, созданная сегодня (06.04.2012 23:09:44), имеет дату (2012-04-07 04:09:44) в базе данных. Разве Django справляется с этим? –

+0

Это помогло, спасибо! –

+0

@Just_Mad, Да, django хранит все как UTC в базе данных. – mklauber

0

Попробуйте

from datetime import datetime 
now=datetime.now() 
YourModel.objects.filter(datetime_published=datetime(now.year, now.month, now.day)) 
+2

Не сработает, вы все равно будете сравнивать 2011-04-06TXX: XX: XX до 2011-04-06T00: 00: 00. Это будет ложным, если не будет. – mklauber

+0

Я не вижу, как это не должно работать. Это точный эквивалент «SELECT * FROM table WHERE date = '2002-04-05» « – luke14free

+0

YourModel.objects.filter (created__published = datetime (now.year, now.month, now.day)), правильно ли? –

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