【问题标题】:Custom User model in rest-auth: RelatedObjectDoesNotExistrest-auth 中的自定义用户模型:RelatedObjectDoesNotExist
【发布时间】:2018-07-26 16:23:03
【问题描述】:

我正在尝试使用 django rest-auth 库实现注册。我遵循了安装和使用指南中的每一条说明,包括带有custom user serializer 的部分。和这里 问题开始了。我们注册了一个新用户,确认电子邮件,当我尝试更新用户时,我得到了同样的错误:

"RelatedObjectDoesNotExist at /rest-auth/user/ 用户没有 用户配置文件。”

我不知道如何进行注册以同时为他创建用户和个人资料。 我知道以前有人问过这个问题,但我没有找到任何可以解释为什么会发生这种情况的东西。我正在寻找一个使用 django-rest-auth 和自定义用户模型进行注册的简单工作示例

models.py:

class UserProfile(models.Model): 
     user = models.OneToOneField(User, primary_key=True, related_name='profile')
     tagline = models.CharField(max_length=140, null=True)
     created_at = models.DateTimeField(auto_now_add=True)
     updated_at = models.DateTimeField(auto_now=True)

     @receiver(post_save, sender=User)
     def create_profile_for_user(sender, instance=None, created=False, **kwargs):
        if created:
            UserProfile.objects.get_or_create(user=instance)

     @receiver(pre_delete, sender=User)
     def delete_profile_for_user(sender, instance=None, **kwargs):
        if instance:
           user_profile = UserProfile.objects.get(user=instance)
           user_profile.delete()

serilizers.py

class UserSerializer(UserDetailsSerializer):
    curriculumVitaeLink = serializers.CharField(source="userprofile.curriculumVitaeLink", required=False)
    class Meta(UserDetailsSerializer.Meta):
        fields = UserDetailsSerializer.Meta.fields + (
            'curriculumVitaeLink'
        )

    def update(self, instance, validated_data):
        profile_data = validated_data.pop('userprofile', {})
        curriculumVitaeLink = profile_data.get('curriculumVitaeLink')
        instance = super(UserSerializer, self).update(instance, validated_data)

        # get and update user profile
        profile = instance.userprofile
        if profile_data :
            profile.curriculumVitaeLink = curriculumVitaeLink
            profile.save()
        return instance

    def destroy(self, request, pk=None, **kwargs):
        request.user.is_active = False
        request.user.save()
        return Response(status=204)

【问题讨论】:

    标签: django python-3.x django-rest-framework django-rest-auth


    【解决方案1】:

    您应该使用您在OneToOneField 中使用的related_name 获取userprofile 对象 因此:

    profile = instance.userprofile
    

    应该是:

    profile = instance.profile
    

    【讨论】:

    • 我认为作者的代码在某些时候已更改,因为如果属性名称错误,则错误看起来像AttributeError: 'User' object has no attribute 'userprofile'。如果错误为RelatedObjectDoesNotExist,则表示属性名称正确,只是不存在对象。
    • 是的,你是对的。发生该错误是因为尚未创建配置文件实例。正如@MaximKukhtenkov 提到的
    【解决方案2】:

    RelatedObjectDoesNotExist这里的错误意味着在创建用户对象时,信号没有创建相应的用户配置文件对象。根据问题中的 sn-p,可能是因为信号是如何定义的:

    Django 信号需要在模块级别定义,而不是作为模型实例方法 - 您需要将缩进向左移动:

     class UserProfile(models.Model): 
         user = models.OneToOneField(User, primary_key=True, 
         related_name='profile')
         tagline = models.CharField(max_length=140, null=True)
         created_at = models.DateTimeField(auto_now_add=True)
         updated_at = models.DateTimeField(auto_now=True)
    
    
     @receiver(post_save, sender=User)
     def create_profile_for_user(sender, instance=None, created=False, **kwargs):
        if created:
            UserProfile.objects.get_or_create(user=instance)
    

    这样UserUserProfile 对象都应该在注册时创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 2016-07-02
      • 2013-02-07
      • 2013-08-29
      • 2020-07-05
      相关资源
      最近更新 更多