如何将参数传递给我的自定义保存方法,保留适当的*args
,**kwargs
以传递给te super方法?我正在尝试这样的事情:
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
由于某种原因被认为是一个意想不到的论点。
答案 0 :(得分:20)
关键字参数必须遵循位置参数。试试这个:
def save(self, my_value, *args, **kwargs):
....
或:
def save(self, *args, **kwargs):
my_value = kwargs.pop('my_value', None)
答案 1 :(得分:3)
您可以尝试以下操作。
将保存方法覆盖为:
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
并保存它。
答案 2 :(得分:0)
现有答案不完整。
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
。这意味着所有自定义逻辑都将被完全忽略。
由于这些风险,我认为问题的前提是应避免的反模式。与其重载内置的save方法,不如创建一个完全不同的(factory)方法来包含您的特殊行为,例如mymodel.special_save()
。