使用 lambda 作为属性的默认值时,Django 1.7.1 Makemigrations 失败
Posted
技术标签:
【中文标题】使用 lambda 作为属性的默认值时,Django 1.7.1 Makemigrations 失败【英文标题】:Django 1.7.1 Makemigrations fails when using lambda as default for attribute 【发布时间】:2015-01-20 05:45:40 【问题描述】:我正在使用 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,)
一切正常。
但是,当我将以下属性添加到 myModel 时,它会中断:
y = models.DateTimeField(default=lambda: datetime.utcnow() + timedelta(days=1), editable=False)
manage.py makemigrations
给我以下错误:
ValueError: Cannot serialize function: lambda
这似乎是一个已知的错误:http://comments.gmane.org/gmane.comp.python.django.scm/125724
那么我该如何解决呢?我需要将 y
的值默认自动设置为从模型创建的那一刻起 24 小时。
【问题讨论】:
【参考方案1】:migrations documentation 解决了这个问题:
迁移只是包含模型旧定义的 Python 文件——因此,要编写它们,Django 必须获取模型的当前状态并将它们序列化到一个文件中。虽然 Django 可以序列化大多数东西,但有些东西我们无法序列化为有效的 Python 表示形式......
Django 可以序列化以下内容:任何函数或方法引用...在模块的***范围内
Django 无法序列化:Lambdas
所以解决方案很简单:不用 lambda,而是定义一个常规函数并通过名称引用它。
def one_day_hence():
return datetime.utcnow() + timezone.timedelta(days=1)
class MyModel(models.Model):
y = models.DateTimeField(default=one_day_hence)
【讨论】:
以上是关于使用 lambda 作为属性的默认值时,Django 1.7.1 Makemigrations 失败的主要内容,如果未能解决你的问题,请参考以下文章