这个重写保存方法的Django IntegrityError

时间:2018-01-20 10:35:42

标签: python django method-overriding

我的模特

class Worksite(models.Model):
    firm = models.ForeignKey('Firm', verbose_name='Firma', related_name="worksites", on_delete=models.CASCADE)
    name = models.CharField(max_length=50, unique=True, verbose_name="Şantiye Adı")

我的保存方法

def save(self, *args, **kwargs):
    if not self.slug:
        self.slug = self.get_unique_slug()
        os.mkdir(BASE_DIR+'/file/'+slugify(str(self.firm).replace('ı','i'))+'/'+self.slug)
    return super(Worksite, self).save(self, *args, **kwargs)

我的UpdateView

class WorksiteUpdateView(generic.edit.UpdateView):
    template_name = 'firm/worksite_update.html'
    model = Worksite
    form_class = WorksiteForm

    def get_success_url(self, *args, **kwargs):
        return reverse('firm:worksite_list')
  

IntegrityError:(1062,“重复输入'1'用于键'PRIMARY'”)

如果删除了save方法,则更新过程成功。但这次无法创建文件夹。所以保存方法是必要的。但这个错误很烦人。 错误在哪里? 请帮助。

2 个答案:

答案 0 :(得分:1)

您是否错误地调用了父方法?尝试return super(Worksite, self).save(*args, **kwargs)(删除额外的self参数)。

答案 1 :(得分:1)

这是因为在调用超类方法时传递self参数 - super().save()。它应该可以正常工作,如果你删除它:

return super(Worksite, self).save( *args, **kwargs)