将参数传递给自定义 save() 方法

Posted

技术标签:

【中文标题】将参数传递给自定义 save() 方法【英文标题】:passing an argument to a custom save() method 【发布时间】:2010-03-29 02:09:29 【问题描述】:

如何将参数传递给我的自定义保存方法,保留正确的 *args**kwargs 以传递给超级方法?我正在尝试类似:

form.save(my_value)

def save(self, my_value=None, *args, **kwargs):

   super(MyModel, self).save(*args, **kwargs)

   print my_value

但这似乎不起作用。我做错了什么?

编辑:我找到了这个例子(见最后一条消息,传递“重新排序”): http://groups.google.com/group/django-users/browse_thread/thread/b285698ea3cabfc9/6ce8a4517875cb40?lnk=raot

这本质上是我想要做的,但由于某种原因,my_value 据说是一个意外的论点。

【问题讨论】:

您正在展开保存调用中的参数! 定义的方法save(self, my_value=None, *args, **kwargs) 需要关键字参数:save(my_value=some_value)(检查这个关于positional and keyword arguments 的问题) 【参考方案1】:

关键字参数必须跟在位置参数之后。试试这个:

def save(self, my_value, *args, **kwargs):
    ....

或:

def save(self, *args, **kwargs):
    my_value = kwargs.pop('my_value', None)

【讨论】:

似乎没有用 - python 说这是一个语法错误【参考方案2】:

您可以尝试以下方法。

将保存方法重写为:

def save(self, my_val, *args, **kwargs):
    print my_val
    # do_something here
    return super(MyModel, self).save(*args, **kwargs)

在调用 save 方法时:

MyModel.save(my_val="fooooo")

这将打印my_val 并保存。

【讨论】:

【参考方案3】:

现有答案不完整。

Model.save 的问题在于有多种方法可以到达它,最明显的是通过Model.objects.create()。查询集create() 调用不会将其他参数传递给Model.save,您的代码可能无法按预期运行。

您可以在这里轻松查看create() 和其他方法(get_or_create、update_or_create)的源代码:https://github.com/django/django/blob/2.2.7/django/db/models/query.py#L415

QuerySet 的bulk_create 方法根本不调用save。这意味着任何自定义逻辑都将被完全忽略。

由于这些风险,我认为问题的前提是要避免的反模式。与其重载内置的保存方法,不如创建一个完全不同的(工厂)方法来包含您的特殊行为,例如mymodel.special_save().

【讨论】:

以上是关于将参数传递给自定义 save() 方法的主要内容,如果未能解决你的问题,请参考以下文章

将 UDF 方法作为参数传递给 KSQL 中的其他 UDF

将自定义启动参数传递给 detox

如何将附加参数传递给自定义 python 排序函数

使用颤振将多个参数传递给命名路由

如何将三个或多个参数传递给自定义模板标签过滤器 django?

是否存在某种方式将自定义参数传递给 Firebase 上的短动态链接?