Абстрактная родительская модель Django сохраняет переопределение

Я пытаюсь написать абстрактную родительскую модель в Django, которая поможет мне создать поле slug из поля name для многих других дочерних моделей. Он использует кодировку trans, которая идеально подходит для транслитерации кириллицы в латинские буквы. Затем он использует функцию slugify из django для удаления мусора.

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)?


person Павел Тявин    schedule 18.11.2012    source источник
comment
Проверьте этот вопрос (дубликат) для ответа: заголовок stackoverflow.com/questions/10948132/   -  person mjjohnson    schedule 18.11.2012
comment
В этой теме нет хорошего ответа.   -  person gornvix    schedule 11.09.2020


Ответы (2)


Ладно, я понял. Вместо использования super(self.__class__, self).save(*args, **kwargs).

Мне нужно super(SlugModel, self).save(*args, **kwargs).

Спасибо перцовщику.

person Павел Тявин    schedule 18.11.2012

Просто используйте super().save(*args, **kwargs).

person gornvix    schedule 11.09.2020