这里我只是使用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的批量创建/更新。