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

Django save()方法仅更新3个字段中的2个,company_name字段无法保存

问题排查与解决方案

看起来你的问题出在模型字段的定义错误上,导致ORM无法正确映射到数据库列进行更新。让我一步步帮你分析:

核心问题:name参数的误用

在models.py中,你给company_name字段设置了name='Company Name',这是关键错误:

# 错误的定义
company_name = models.CharField(name='Company Name',max_length=100, null=False, blank=True, default="")

Django里CharField的name参数是用来指定数据库表的列名的,你这里把列名改成了带空格的Company Name。而当你在视图中执行user.company_name = 'Cool'时,Django ORM默认会尝试更新名为company_name的数据库列,但实际数据库里的列是Company Name,这就导致更新操作静默失败(不会报错,但数据不会写入)。

而UpdateProfileView能正常更新,是因为它基于CustomUserChangeForm生成表单,表单会读取模型字段的.db_column属性(也就是你设置的Company Name),所以能正确找到数据库列完成更新。

解决方案

1. 修正模型字段定义

把name='Company Name'替换成verbose_name='Company Name'——这才是设置字段友好显示名称的正确参数:

# 正确的定义
company_name = models.CharField(verbose_name='Company Name', max_length=100, null=False, blank=True, default="")

2. 同步数据库结构

生成并应用迁移,确保数据库列名和模型字段正确映射:

python manage.py makemigrations
python manage.py migrate

3. 额外排查(可选)

如果问题仍然存在,检查你的CustomUser模型是否重写了save方法:

  • 如果有重写,确保方法中没有过滤掉company_name字段,并且调用了super().save(*args, **kwargs)来执行默认的保存逻辑。

验证方法

你可以在视图中临时添加打印语句,确认内存中的对象是否被修改:

# 在ConfirmWorkEmailView的get方法中
user.work_email_verified = True
user.first_name = 'Rodrigo'
user.company_name = 'Cool'
print("赋值后company_name:", user.company_name)  # 应该输出'Cool'
user.save()
user.refresh_from_db()  # 从数据库重新读取数据
print("保存后company_name:", user.company_name)  # 如果数据库更新成功,会输出'Cool'

如果赋值后打印正确,但刷新后回到旧值,就坐实了数据库列映射的问题,按照上面的步骤修正即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:17:56