重写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
相关产品推荐
相关产品推荐

