You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重写Django Worksite模型save方法引发IntegrityError问题求助

问题根源与解决方案

我一眼就发现问题出在你重写的save方法里的父类调用部分了!

错误原因

你在调用父类的save方法时,错误地把self作为第一个参数传递了:

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

Django的Model.save()方法不需要手动传入self——因为通过super(Worksite, self)已经绑定了当前实例,额外传递self会导致方法接收的参数异常。在更新操作时,这个错误会让Django误以为你要创建一个新对象,而非更新现有对象,于是尝试插入一条主键(PRIMARY)已存在的记录,直接触发IntegrityError(主键重复)。

修正后的save方法

把多余的self参数去掉,同时还可以优化几个细节(比如用os.path.join避免路径拼接错误、判断文件夹是否存在再创建,防止重复创建报错):

import os
from django.utils.text import slugify
from django.conf import settings

def save(self, *args, **kwargs):
    if not self.slug:
        self.slug = self.get_unique_slug()
        # 用os.path.join安全拼接路径,避免系统路径分隔符问题
        firm_slug = slugify(str(self.firm).replace('ı','i'))
        folder_path = os.path.join(settings.BASE_DIR, 'file', firm_slug, self.slug)
        # 判断文件夹是否存在,不存在再创建(防止重复创建抛出异常)
        if not os.path.exists(folder_path):
            os.makedirs(folder_path)
    # 正确调用父类save方法,无需额外传递self
    return super().save(*args, **kwargs)

注:推荐使用settings.BASE_DIR代替直接引用全局的BASE_DIR,更符合Django的配置规范。

额外优化建议

  • 如果你的业务允许更新slug字段,还需要补充逻辑:比如当slug发生变化时,是否需要迁移旧文件夹内的文件,或者删除旧文件夹——这部分可以根据实际需求扩展。
  • 确保get_unique_slug方法能稳定生成唯一的slug值,避免因为slug重复引发其他异常。

修正后,你的WorksiteUpdateView就能正常执行更新操作,同时文件夹创建逻辑也能正常生效。

内容的提问来源于stack exchange,提问作者mstgnz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:44:02