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

时间:2010-03-29 02:09:30

标签: python django django-models

如何将参数传递给我的自定义保存方法,保留适当的*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由于某种原因被认为是一个意想不到的论点。

3 个答案:

答案 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()