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

Django更新数据库图片对象时重复创建新记录问题修复

问题根源

你在更新逻辑分支里额外创建新记录的核心原因是:实例化全新的Image对象后,调用image.img.save()时传入了save=True参数,这一步会直接把这个没绑定当日记录标识的全新Image对象存入数据库。后续你虽然执行了当日旧记录的update操作,但这条提前落库的新记录已经留在表里了,自然会出现多余条目。
另外你的代码还有一个隐性bug:不管是更新还是新建分支,实例化Image时都没有给date字段赋值,如果模型层没给date配置当日默认值,查询user=user, date=today时永远匹配不到已有记录,会持续走新建分支。

修复步骤
  • 先调整Image模型,给date字段加上当日默认值,避免手动传值遗漏
# models.py
from datetime import date
from django.db import models

class Image(models.Model):
    user = models.ForeignKey(你的用户模型, on_delete=models.CASCADE)
    img = models.ImageField(upload_to='media/')
    # 新增默认值,创建记录时自动填充当日日期
    date = models.DateField(default=date.today)
  • 重构视图逻辑,去掉重复代码,更新分支直接操作已存在的记录,不要新建Image实例
import base64
import uuid
from django.core.files.base import ContentFile

if img is None:
    messages.error(request, "Please submit an image.")
    return render(request, 'page.html')

# 公共逻辑提前:解码图片、生成唯一文件名
image_file = ContentFile(base64.b64decode(img))
file_name = f"{uuid.uuid4()}.png"
# 先查当前用户当日是否已有上传记录
user_today_img = Image.objects.filter(user=user, date=today).first()

if user_today_img:
    # 有历史记录:直接替换原有图片,save=True只会更新当前这条记录,不会新建
    user_today_img.img.save(file_name, image_file, save=True)
else:
    # 无历史记录:创建新实例后存图
    new_img = Image(user=user)
    new_img.img.save(file_name, image_file, save=True)

return render(request, 'page.html')
优化说明
  • 把重复的图片解码、文件名生成逻辑抽成公共部分,减少冗余代码
  • 更新分支直接操作查询到的已有记录,完全不会生成新的数据库条目
  • 模型层统一处理date字段赋值,避免手动传值漏写导致的查询匹配失败
  • 去掉了原来手动拼接path再update的多余操作,Django的ImageField保存时会自动生成正确的存储路径,不需要手动拼接

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:03:16