【问题标题】:Django 1.7 makemigrations - ValueError: Cannot serialize function: lambdaDjango 1.7 makemigrations - ValueError:无法序列化函数:lambda
【发布时间】:2014-10-08 12:02:49
【问题描述】:

我切换到 Django 1.7。当我为我的应用程序尝试 makemigrations 时,它崩溃了。崩溃报告是:

Migrations for 'roadmaps':
  0001_initial.py:
    - Create model DataQualityIssue
    - Create model MonthlyChange
    - Create model Product
    - Create model ProductGroup
    - Create model RecomendedStack
    - Create model RecomendedStackMembership
    - Create model RoadmapMarket
    - Create model RoadmapUser
    - Create model RoadmapVendor
    - Create model SpecialEvent
    - Create model TimelineEvent
    - Create model UserStack
    - Create model UserStackMembership
    - Add field products to userstack
    - Add field viewers to userstack
    - Add field products to recomendedstack
    - Add field product_group to product
    - Add field vendor to product
    - Add field product to dataqualityissue
Traceback (most recent call last):
  File "manage.py", line 29, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 377, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 338, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/makemigrations.py", line 124, in handle
    self.write_migration_files(changes)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/makemigrations.py", line 152, in write_migration_files
    migration_string = writer.as_string()
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/writer.py", line 129, in as_string
    operation_string, operation_imports = OperationWriter(operation).serialize()
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/writer.py", line 80, in serialize
    arg_string, arg_imports = MigrationWriter.serialize(item)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/writer.py", line 245, in serialize
    item_string, item_imports = cls.serialize(item)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/writer.py", line 310, in serialize
    return cls.serialize_deconstructed(path, args, kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/writer.py", line 221, in serialize_deconstructed
    arg_string, arg_imports = cls.serialize(arg)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/writer.py", line 323, in serialize
    raise ValueError("Cannot serialize function: lambda")
ValueError: Cannot serialize function: lambda

我在https://code.djangoproject.com/ticket/22892找到了一个关于此的注释

还有文档链接https://docs.djangoproject.com/en/dev/topics/migrations/#serializing-values

但这并没有让我更清楚。错误消息没有给我提示在哪里寻找问题。

有什么方法可以检测出究竟是哪条线路导致了问题?

有什么提示吗?

【问题讨论】:

  • 你的字段Product.dataqualityissue是什么样的?
  • @Alasdair 是product = models.ForeignKey(Product, blank=True, null=True)
  • 好的,该字段看起来没问题。您是否在 Product 模型或您的任何其他模型中使用 lambda 函数?
  • @Alasdair 不,至少我不知道。我不知道是什么型号导致了崩溃,所以我无法进一步调查。
  • 除非你展示你的模型,否则很难帮助你。

标签: python django


【解决方案1】:

我们在自定义字段定义中使用 lambda 时遇到了这个问题。

很难发现,因为它没有在回溯中列出,并且在使用此类自定义字段的特定模型上也没有引发错误。

我们的解决方法:

  • 检查您的所有自定义字段(即使在第 3 方库中)
  • 将 lambda 更改为可调用,它在模块中定义(即不在自定义字段类中)

【讨论】:

    【解决方案2】:

    我花了一些时间才弄明白,这是@Radek 建议的代码示例。

    lambda 替换为函数的示例。

    Borken 版本:

    class SomeModel(ParentModel):
        thing_to_export = ArrayField(models.CharField(max_length=50), 
                                     default=lambda: ['Default thing'])
    

    工作版本:

    def default_thing():
        return ['THIS IS A DEFAULT']
    
    class SomeModel(ParentModel):
        thing_to_export = ArrayField(models.CharField(max_length=50), 
                                     default=default_thing)
    

    【讨论】:

      猜你喜欢
      • 2015-09-21
      • 2018-09-13
      • 2015-01-18
      • 2015-02-28
      • 2014-11-14
      • 2014-09-14
      • 2015-11-04
      • 1970-01-01
      • 2015-03-19
      相关资源
      最近更新 更多