ValueError:使用makemigrations时无法序列化函数:lambda

Ser*_*ity 8 python django django-models python-3.x

当我这样做时python manage.py makemigrations,我得到了上述错误,我不确定错误发生在哪里.我看到一些关于这个问题的帖子,但我发现主要是在DateTimeField()函数传递的地方但在我的情况下我使用了auto_now属性而不是一些与datetime相关的函数.

但是,我在类方法中使用了lambda函数,如下所示.

@classmethod
    def get_content_models(cls):
        """
        Return all Package subclasses.
        """
        is_content_model = lambda m: m is not Package and issubclass(m, Package)


def set_helpers(self, context):
    current_package_id = getattr(current_package, "id", None)
    current_parent_id = getattr(current_package, "parent_id", None)
    self.is_current_child = self.parent_id == current_package_id
    self.is_child = self.is_current_child

    def is_c_or_a(package_id):
        parent_id = context.get("_parent_package_ids", {}).get(package_id)
        return self.id == package_id or (parent_id and is_c_or_a(parent_id))
    self.is_current_or_ascendant = lambda: bool(is_c_or_a(current_package_id))
Run Code Online (Sandbox Code Playgroud)

我不清楚这个问题,所以我发布了解原因.以上代码是否创建了该问题?如果是原因,应该做什么呢?

我不知道这个问题究竟在哪里,所以这里是详细介绍models.py of package app因为代码有点大.它没有达到预订模型,所以我只是把包应用程序的代码,在这里

https://gist.github.com/SanskarSans/51d2f287309a97163e680cc38abd3e06

UPDATE

在我的Package模型中,我使用了自定义字段,在该字段中使用了lambda而不是callable函数,这就产生了一个问题.由于模型的长文件,我没有在这里粘贴,我为此道歉.

这就是我所做的

in_menus = MenusField(_("Show in menus"), blank=True, null=True)

class MenusField(MultiChoiceField):
    """
    ``MultiChoiceField`` for specifying which menus a package should
    appear in.
    """

    def __init__(self, *args, **kwargs):
        choices = [t[:2] for t in getattr(settings, "PAGE_MENU_TEMPLATES", [])]
        default = getattr(settings, "PAGE_MENU_TEMPLATES_DEFAULT", None)
        if default is None:
            default = [t[0] for t in choices]
        elif not default:
            default = None
        if isinstance(default, (tuple, list)):
            d = tuple(default)
            # this lambda should be avoided
            # default = lambda:d 
            default = default_value(d)
        defaults = {"max_length": 100, "choices": choices, "default": default}
        defaults.update(kwargs)
        super(MenusField, self).__init__(*args, **defaults)
Run Code Online (Sandbox Code Playgroud)

Pau*_*ius 0

我假设您正在使用 pickle 模块进行序列化。

您无法对定义的类进行pickle set_helpers。该方法设置self.is_current_or_ascendant为 lambda 函数,并且这些函数位于无法 pickle 的列表中(请参阅https://docs.python.org/3/library/pickle.html中的 12.1.4 )。

类方法不会成为问题,因为它只定义一个局部变量 ,is_content_model该变量会立即超出范围并被删除。事实上,正如您在此处介绍的那样,该方法根本不执行任何操作。