我在ubuntu gnome 16.04上使用django 1.8.8,django-rest-framework 3.3.0和python 2.7.12。
我有一个django模型MyModel。在该模型中,我按以下方式覆盖save方法:
def save(*args, **kwargs):
...
super(MyModel, self).save(*args, **kwargs)
...
我发现的问题是,有时 super 被称为常用函数,在调用之后执行下一行。但有时它是递归调用本身,我们转到函数的第一行。 当它从单元测试中调用为self.client.post(...)时,行为是 递归。当从单元测试中调用它作为MyModel.save()时,行为是正常的。 我还发现,当它从客户端调用时,会有空的args和kwargs。但当它被称为MyModel.save()时,会有以下kwargs:
kwargs = {'using': 'default', 'force_insert': True}
我修改了我的代码:
def save(*args, **kwargs):
...
kwargs.update({'using': 'default', 'force_insert': True})
super(MyModel, self).save(*args, **kwargs)
...
但这不会改变递归行为。
如果有人告诉我如何解决这个问题会很棒。
增加1:
这就是班级的样子:
class MyModel(BaseDate, AuthStampedModel):
......
def save(*args, **kwargs):
.....
kwargs.update({'using': 'default', 'force_insert': True})
super(MyModel, self).save(*args, **kwargs)
.....
增加2:
class BaseDate(models.Model):
added = models.DateTimeField(_('created on'), default=now)
updated = models.DateTimeField(_('updated on'), default=now)
class Meta:
abstract = True
def save(self, *args, **kwargs):
auto_update = kwargs.get('auto_update', True)
if auto_update:
self.updated = now()
if 'auto_update' in kwargs:
kwargs.pop('auto_update')
super(BaseDate, self).save(*args, **kwargs)
class AuthStampedModel(Model):
created_by = CreatingUserField(verbose_name = _("created by"), related_name = "created_%(app_label)s_%(class)s_set")
created_with_session_key = CreatingSessionKeyField(_("created with session key"))
modified_by = LastUserField(verbose_name = _("modified by"), related_name = "modified_%(app_label)s_%(class)s_set")
modified_with_session_key = LastSessionKeyField(_("modified with session key"))
class Meta:
abstract = True