django中出现异常:查询集没有用户属性



这里我只是使用django.contrib.auth.models import User中的用户模型,我有一个自定义的用户配置文件模型,其中用户外键在django内置的用户模型中,我创建了一个可以由用户手动更新的email_address字段,还有一个其他的电子邮件字段内置于django用户模型中,我想将该电子邮件字段更新为userprofile电子邮件地址字段更新。我只是获取用户对象的用户名,并尝试获取该用户对象的电子邮件,但收到一个错误:"QuerySet"对象没有属性"email">

型号.py

def save(self,*args, **kwargs):
user_obj = User.objects.filter(username=self.user.username)
print(user_obj,'user object')
print(user_obj.email,'email have a user') 
email = self.email_address
user_obj.email = self.email_address
print(user_obj.email,'email have a user') 
user_obj.save(user_obj.email)
super(UserProfile,self).save(*args, **kwargs)   

user_obj不是User对象,而是User对象中的QuerySet

您可以使用.get(…)[Django-doc]:检索单个User对象

def save(self,*args, **kwargs):
user_obj = User.objects.get(username=self.user.username)
user_obj.email = self.email_address
user_obj.save()
super(UserProfile,self).save(*args, **kwargs)

但在这里,您实际上可以简单地使用self.user对象:

def save(self,*args, **kwargs):
user =self.user
user.email = self.email_address
user.save()
super(UserProfile,self).save(*args, **kwargs)

话虽如此,我建议不要存储两次数据。因此,在User对象具有email地址的情况下,也不需要将其存储在UserProfile模型中。您可以通过以下方式轻松访问:

from django.conf import settings
class UserProfile(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
@property
defemail_address(self):
returnself.user.email

因此,这意味着您可以访问相关User对象的email地址。这样可以避免数据重复,这将使数据难以保持同步。特别是因为.save()方法不会运行,例如Django ORM的批量创建/更新。

最新更新