Django Model

时间:2018-02-03 15:25:13

标签: django django-models django-rest-framework django-orm

我在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

0 个答案:

没有答案