Django中如何获取关联引用的CustomUser模型的user_field_2字段值
Django 跨关联模型字段取值校验解决方案
首次报错原因说明
你第一次写的CustomUser.objects.user_field_2存在语法逻辑错误:CustomUser.objects是模型的管理器对象,用来批量操作所有用户数据,本身不具备模型的字段属性,因此会抛出'UserManager' object has no attribute 'user_field_2'的报错。你需要获取的是当前UserProfile实例绑定的单个用户实例的字段值,而非全局管理器的属性。
条件始终返回False的原因排查
你后续写的self.user.user_field_2 == 'required_value'逻辑本身是正确的,始终返回False通常是以下几个原因导致:
- 校验的目标值和
My_CHOICE_SELECTION里定义的选项值不完全匹配,注意大小写、拼写、特殊符号要完全一致,比如定义的选项是Option_1就不能写option_1或者Option1 - 关联的用户实例的
user_field_2字段确实未被赋值为目标值,可以临时加一行打印代码确认实际存储值:print(self.user.user_field_2, type(self.user.user_field_2)) - 你修改用户的
user_field_2之后没有先保存用户实例,就直接保存了UserProfile,此时self.user读取的是缓存的旧值,无法拿到最新修改后的内容
最终可用实现代码
My_CHOICE_SELECTION = ( ('Option_1', 'Option_1'), ('Option_2', 'Option_2'), ) class CustomUser(AbstractUser): user_field_1 = models.CharField(max_length=100, blank=True, null=True) user_field_2 = models.CharField(max_length=20, choices=My_CHOICE_SELECTION) class UserProfile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) profile_field_1= models.CharField(max_length=100, blank=True, null=True) # 重写save方法 def save(self, *args, **kwargs): super(UserProfile, self).save(*args, **kwargs) # 新增:刷新关联用户的最新数据,避免读取缓存旧值 self.user.refresh_from_db() # 直接校验关联用户的字段值,注意和choices定义的选项值完全匹配 if self.user.user_field_2 == 'Option_1': # 真值分支逻辑 pass else: # 假值分支逻辑 pass
补充注意事项
- 如果
user_field_2字段允许为空,判断前可以先判空避免异常:if self.user.user_field_2 and self.user.user_field_2 == 'Option_1': - 如果你是在创建
UserProfile的同时创建关联用户,需要先保存用户实例到数据库,再绑定到UserProfile,否则无法正常读取字段值
内容的提问来源于stack exchange,提问作者Lubna Ather
相关产品推荐
相关产品推荐

