将参数传递给自定义 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() 方法的主要内容,如果未能解决你的问题,请参考以下文章