当使用lambda作为属性的默认值时,Django 1.7.1 Makemigrations失败

Saq*_*Ali 25 django lambda django-models django-migrations

我正在使用Django 1.7.1.我的模型看起来像这样:

from datetime import datetime
from django.db import models

class myModel(models.Model):
    x = models.CharField(max_length=254,null=True, blank=True,)
Run Code Online (Sandbox Code Playgroud)

一切都很好.

但是,当我将以下属性添加到myModel时,它会中断:

    y = models.DateTimeField(default=lambda: datetime.utcnow() + timedelta(days=1), editable=False)
Run Code Online (Sandbox Code Playgroud)

manage.py makemigrations 给我以下错误:

ValueError: Cannot serialize function: lambda
Run Code Online (Sandbox Code Playgroud)

这似乎是一个已知的错误:http://comments.gmane.org/gmane.comp.python.django.scm/125724

那么我该如何解决呢?y从创建模型的那一刻起,我需要将默认值自动设置为24小时.

Kev*_*nry 36

迁移文档解决了这个:

迁移只是包含模型的旧定义的Python文件 - 因此,为了编写它们,Django必须采用模型的当前状态并将它们序列化为文件.虽然Django可以序列化大多数事情,但有些事情我们无法将其序列化为有效的Python表示....

Django可以序列化以下内容:任何函数或方法引用

Django无法序列化:Lambdas

所以解决方案很简单:只需在模块范围内定义函数,而不是使用lambda.

  • 我偶然发现了你的答案.对于像我这样的初学者,我们不会通过"定义模块范围中的函数"来了解您的意思. (2认同)
  • @Valachio它意味着在同一个文件中定义函数.请参阅此处的示例:/sf/answers/1070266221/ (2认同)