此覆盖保存方法的 Django IntegrityError

Posted

技术标签:

【中文标题】此覆盖保存方法的 Django IntegrityError【英文标题】:Django IntegrityError of this overriding save method 【发布时间】:2018-01-20 10:35:42 【问题描述】:

我的模型

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)

我的更新视图

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, "Duplicate entry '1' for key 'PRIMARY'")

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于此覆盖保存方法的 Django IntegrityError的主要内容,如果未能解决你的问题,请参考以下文章

如何以 django 模型形式覆盖保存方法

Django 信号与覆盖保存方法

Django - 覆盖保存方法时检查旧值和新值之间的差异

在Django中覆盖保存方法时的无限循环

Django:如何覆盖 form.save()?

将 Django 模型中的保存方法覆盖为使用 celery 异步的最佳实践