Django datefield and timefield to python datetime

You shoud add new field like a merge datetime field. Better for Performance.

event_full_datetime = models.DateTimeField()

fix old database. for shell like this script.

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()

Use a DateTimeField instead (see this section in the docs). Conversion to a datetime.datetime is handled for you by Django automatically.

A DateField results in a datetime.date and a datetime.time object. You can use replace to merge these values into an updated 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)

Note that the resulting date has 11.30 as time now. Note also that today is not modified, it simply computes a new date and time. As you can see, you now have to do the merging yourself because both values are stored in separate fields. That's why a DateTimeField is a much better choice, if you have the ability to modify the model's fields.


If you need to store a NULL (unknown) time then you can use datetime.combine within a computed property:

from datetime  import datetime, time
from django.db import models

class Event( models.Model ):
  event_date = models.DateField()
  event_time = models.TimeField( null = True )

  @property
  def event_datetime( self ):
    """The combined event_date and event_time (or midnight if unset)."""
    return datetime.combine( self.event_date, self.event_time if self.event_time is not None else time.min )