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

