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

Django中调用save()更新记录时却创建新记录的问题排查

问题原因

你遇到的问题核心在于:sessionid是模型的主键,而你在save方法里每次保存都会重新生成新的sessionid。

Django判断是更新现有记录还是创建新记录,完全依赖主键:如果对象的主键已存在(对应数据库里的一条记录),就执行更新;如果主键不存在或被修改为新值,就会当作新对象插入数据库,所以旧记录会保留,同时生成一条带新主键的新记录。

解决方案

修改save方法,只在新建对象的时候才生成sessionid,更新时保持原主键不变。具体代码修改如下:

def save(self, *args, **kwargs):
    # 仅当对象是新建状态(主键未设置)时,生成sessionid
    if not self.pk:
        session_count = Session.objects.all().count()
        self.sessionid = 'S' + self.forgepass.forgepass + id_gen(session_count)
    super().save(*args, **kwargs)

补充说明

  • self.pk是Django模型对象主键的快捷访问方式,新建对象的self.pk为None,已存在的对象则对应数据库中的主键值。
  • 额外提醒:用Session.objects.all().count()来生成编号存在并发风险(多个请求同时创建时可能得到相同的count值,导致sessionid重复),如果需要保证唯一性,可以考虑使用数据库事务或者更可靠的编号生成方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:16:01