【问题标题】:Django 1.7.1 Makemigrations fails when using lambda as default for attribute使用 lambda 作为属性的默认值时,Django 1.7.1 Makemigrations 失败
【发布时间】: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 小时。

【问题讨论】:

    标签: django django-models lambda django-migrations


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      • 2011-04-11
      相关资源
      最近更新 更多