Django 抽象父模型保存覆盖

Posted

技术标签:

【中文标题】Django 抽象父模型保存覆盖【英文标题】:Django abstract parent model save overriding 【发布时间】:2012-11-06 15:10:45 【问题描述】:

我正在尝试在 Django 中编写一个抽象父模型,这将帮助我从 name 字段中为许多其他子模型创建一些 slug 字段。它使用 trans 编码,非常适合将西里尔字母转写为拉丁字母。然后它使用 django 的 slugify 函数来清除垃圾。

class SlugModel(models.Model):
    class Meta:
        abstract = True

    name = models.CharField(max_length=128, default=u'')
    slug = models.CharField(max_length=128,blank=True)

    def save(self, *args, **kwargs):
        if not self.slug:
            slug = slugify(unicode(self.name).encode('trans'))
        else:
            slug = self.slug
        count = self.__class__.objects.filter(slug = slug).count()
        if count > 1:
            if slug[-2]=='_':
                count = int(slug[-1])
                slug = slug[:-2]
            self.slug = '0_1'.format(slug,count+1)
        else:
            self.slug = slug
        super(self.__class__, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.name



class Foo(SlugModel):
    pass

当我试图保存一些 Foo 对象时会出现问题:它会导致 RuntimeError(超出最大递归深度)。我究竟做错了什么?如何正确书写super(self.__class__, self).save(*args, **kwargs)

【问题讨论】:

查看这个问题(重复)以获得答案:***.com/questions/10948132/… 那个帖子没有好的答案。 【参考方案1】:

好的,我明白了。而不是使用super(self.__class__, self).save(*args, **kwargs)

我需要super(SlugModel, self).save(*args, **kwargs)

感谢胡椒种植者。

【讨论】:

【参考方案2】:

只需使用super().save(*args, **kwargs)

【讨论】:

以上是关于Django 抽象父模型保存覆盖的主要内容,如果未能解决你的问题,请参考以下文章

limit_choices_to 的 Django 抽象模型覆盖方法

Django - 覆盖模型保存()

如何以 django 模型形式覆盖保存方法

Django:覆盖保存(模型或管理部分)

保存自定义用户模型时 Django ManyToMany 覆盖

将 Django 模型中的保存方法覆盖为使用 celery 异步的最佳实践