使用 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 失败的主要内容,如果未能解决你的问题,请参考以下文章

Wix-使用属性名称作为值时无法写入 XML 文件

在 Web2py 中使用 lambda 作为模型默认值

lambda 表达式作为属性

带有 lambda 作为每个实例化的唯一默认参数的模板

Jmeter工具使用--常用属性及变量

AngularJS:如何在为缺少的属性提供默认值时避免非分配错误?