【问题标题】:Exception in django: Query set have no attribute userdjango 中的异常:查询集没有属性用户
【发布时间】:2020-11-06 11:26:29
【问题描述】:

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

models.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)   

【问题讨论】:

    标签: python django django-models django-views django-templates


    【解决方案1】:

    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
        def email_address(self):
            return self.user.email

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

    【讨论】:

      猜你喜欢
      • 2021-05-22
      • 2021-10-26
      • 2015-05-30
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2018-02-14
      • 2021-06-21
      相关资源
      最近更新 更多