Model induk abstrak Django menyimpan penggantian

Saya mencoba menulis model induk abstrak di Django yang akan membantu saya membuat beberapa bidang slug dari bidang nama untuk banyak model anak lainnya. Ia menggunakan pengkodean trans yang berfungsi sempurna untuk mentransliterasi huruf Sirilik ke huruf Latin. Kemudian menggunakan fungsi slugify dari Django untuk membuang sampah.

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

Masalahnya terjadi ketika saya mencoba menyimpan beberapa objek Foo: ini menyebabkan RuntimeError (kedalaman rekursi maksimum terlampaui). Apa yang saya lakukan salah? Bagaimana cara menulis super(self.__class__, self).save(*args, **kwargs) dengan benar?


person Павел Тявин    schedule 18.11.2012    source sumber
comment
Lihat pertanyaan ini (duplikat) untuk jawabannya: stackoverflow.com/questions/10948132/   -  person mjjohnson    schedule 18.11.2012
comment
Utas itu tidak memiliki jawaban yang bagus.   -  person gornvix    schedule 11.09.2020


Jawaban (2)


OK aku mengerti. Daripada menggunakan super(self.__class__, self).save(*args, **kwargs).

Saya membutuhkan super(SlugModel, self).save(*args, **kwargs).

Terima kasih kepada petani lada.

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

Cukup gunakan super().save(*args, **kwargs).

person gornvix    schedule 11.09.2020