โมเดลพาเรนต์นามธรรมของ 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