web-dev-qa-db-ja.com

Django 1.7.1属性のデフォルトとしてラムダを使用すると、Makemigrationsが失敗する

私は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時間に自動的に設定する必要があります。

25
Saqib Ali

移行ドキュメント はこれに対処します:

移行は、モデルの古い定義を含むPythonファイルです-したがって、それらを書き込むには、Djangoは、モデルの現在の状態を取得してシリアル化する必要がありますDjangoはほとんどのものをシリアル化できますが、有効なPython表現...にシリアル化できないものもあります。

Djangoは以下をシリアル化できます:任意の関数またはメソッド参照

Djangoはシリアル化できません:Lambdas

したがって、ソリューションは単純です。ラムダを使用するのではなく、モジュールスコープで関数を定義するだけです。