Django 1.7.1 Makemigrations fails when using lambda as default for attribute

django, django-migrations, django-models, lambda, python

Solution

The migrations documentation addresses this:

Migrations are just Python files containing the old definitions of your models - thus, to write them, Django must take the current state of your models and serialize them out into a file. While Django can serialize most things, there are some things that we just can’t serialize out into a valid Python representation....

Django can serialize the following: Any function or method reference... in module’s top-level scope

Django cannot serialize: Lambdas

So the solution is simple: instead of a lambda, define a regular function and refer to it by name.

def one_day_hence():
    return datetime.utcnow() + timezone.timedelta(days=1)

class MyModel(models.Model):
    y = models.DateTimeField(default=one_day_hence)

Problem

I'm using Django 1.7.1. My model looks like this: ``` from datetime import datetime from django.db import models class myModel(models.Model): x = models.CharField(max_length=254,null=True, blank=True,) ``` Everything works perfectly fine. However, when I add the following attribute to myModel, it breaks: ``` y = models.DateTimeField(default=lambda: datetime.utcnow() + timedelta(days=1), editable=False) ``` `manage.py makemigrations` gives me the following error: ValueError: Cannot serialize function: lambda This seems like a known bug: http://comments.gmane.org/gmane.comp.python.django.scm/125724 So how can I work around it? I need the value of `y` to be automatically set by default to 24 hours from the moment the model was created.

Original source