ฉันกำลังพยายามเขียนโมเดลพาเรนต์ที่เป็นนามธรรมใน 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)
อย่างถูกต้องได้อย่างไร