2012-03-31 3 views
6

У меня есть модель Django с отдельным полем даты и времени для события. Есть ли способ преобразовать его в объект datetime python, чтобы я мог с некоторой точностью запросить предстоящие события? В настоящее время я получаю только предстоящий следующий день.Django datefield и timefield to python datetime

models.py

event_time = models.TimeField() 
event_date = models.DateField() 

В принципе, я могу фильтровать с минуту, или даже раскол второй precition?

спасибо.

+1

Не уверен, почему это downvoted:/ –

+0

У меня нет никаких проблем с быть downvoted, но я, конечно, не «не показывают исследовательских усилий», я бы не размещать на SO. Проблема в том, что я хотел бы избежать изменения модели базы данных, по крайней мере на данный момент, и я не знаю, как запросить эти два поля. Я могу определить, внутри класса Event, что-то вроде: четкости ev_datetime (самостоятельно): возвращения datetime.datetime.combine (self.event_date, self.start) , но тогда я не могу сделать запрос .filter (event__ev_datetime__gt = сейчас). Это моя проблема в основном. – freethrow

ответ

9

Вместо этого используйте DateTimeField (см. this section в документах). Преобразование в datetime.datetime осуществляется автоматически с помощью Django.

A DateField результат: datetime.date и datetime.time объект. Вы можете использовать replace объединить эти значения в обновленном date:

 
>>> today = datetime.datetime.today() 
>>> today 
datetime.datetime(2012, 3, 31, 11, 6, 5, 182371) 
>>> time = datetime.time(11, 30) 
>>> today.replace(hour=time.hour, minute=time.minute) 
datetime.datetime(2012, 3, 31, 11, 30, 5, 182371) 

Обратите внимание, что в результате date имеет 11.30 как раз в настоящее время. Отметим также, что today не изменен, он просто вычисляет новую дату и время. Как вы можете видеть, теперь вам нужно слить себя, потому что оба значения хранятся в отдельных полях. Вот почему DateTimeField - намного лучший выбор, если у вас есть возможность изменять поля модели.

4

Вы shoud добавляете новое поле, как поле слияния datetime. Лучше для производительности.

event_full_datetime = models.DateTimeField() 

исправить старую базу данных. для оболочки, как этот скрипт.

for obj in YourModel.objects.all(): 
    obj.event_full_datetime = datetime.datetime(obj.event_date.year,obj.event_date.month, obj.event_date.day, obj.event_time.hour, obj.event_time.minut, obj.event_time.second) 
    obj.save() 
Смежные вопросы