Django调用user.userprofile.email_confirmed报RelatedManager错误原因是什么
问题根因
你报错的核心原因是 User 和 UserProfile 之间用了一对多的ForeignKey关联,反向关联的userprofile默认是RelatedManager对象(用来管理多对一/多对多的关联查询),不是单个UserProfile实例,所以不能直接点属性email_confirmed。
两种解决方案
方案1:把关联关系改成一对一(符合一个用户对应一份资料的常规业务逻辑)
把UserProfile里的user字段从ForeignKey替换为OneToOneField即可,修改后代码如下:class UserProfile(models.Model): # 仅修改字段类型,其余参数保持不变 user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,related_name="userprofile") email_confirmed = models.BooleanField(default=False)改完之后
user.userprofile会直接返回单个UserProfile实例,你原有代码的user.userprofile.email_confirmed就可以正常运行,注意修改后需要执行迁移操作同步数据库结构。方案2:保留一对多关联,从
RelatedManager中先取实例
如果业务确实需要允许一个用户对应多份UserProfile,就需要先从关联管理器中拿到具体的实例再操作属性,示例代码如下:# 生成token的逻辑修改为取关联的第一个Profile实例 six.text_type(user.userprofile.first().email_confirmed) # views中赋值逻辑修改 profile = user.userprofile.first() profile.email_confirmed = True profile.save() # 注意这里要保存Profile实例,不能用user.save(),字段存在UserProfile表中
额外注意点
你原有代码里的
user.save()只能保存User表的字段,如果你修改的是UserProfile表的email_confirmed,必须调用对应UserProfile实例的save()方法才会生效,不会跟着user的保存同步更新。
内容的提问来源于stack exchange,提问作者boyenec
相关产品推荐
相关产品推荐

