How to set a Django model field’s default value to a function call / callable (e.g., a date relative to the time of model object creation)

The question is misguided. When creating a model field in Django, you are not defining a function, so function default values are irrelevant:

from datetime import datetime, timedelta
class MyModel(models.Model):
  # default to 1 day from now
  my_date = models.DateTimeField(default=datetime.now() + timedelta(days=1))

This last line is not defining a function; it is invoking a function to create a field in the class.

In this case datetime.now() + timedelta(days=1) will be evaluated once, and stored as the default value.

PRE Django 1.7

Django [lets you pass a callable as the default][1], and it will invoke it each time, just as you want:

from datetime import datetime, timedelta
class MyModel(models.Model):
  # default to 1 day from now
  my_date = models.DateTimeField(default=lambda: datetime.now() + timedelta(days=1))

Django 1.7+

Please note that since Django 1.7, usage of lambda as default value is not recommended (c.f. @stvnw comment). The proper way to do this is to declare a function before the field and use it as a callable in default_value named arg:

from datetime import datetime, timedelta

# default to 1 day from now
def get_default_my_date():
  return datetime.now() + timedelta(days=1)

class MyModel(models.Model):
  my_date = models.DateTimeField(default=get_default_my_date)

More information in the @simanas answer below
[1]: https://docs.djangoproject.com/en/dev/ref/models/fields/#default

Leave a Comment