rest-auth中的自定义用户模型:RelatedObjectDoesNotExist

时间:2018-02-15 19:56:33

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

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

  

" / rest-auth / user / User中的RelatedObjectDoesNotExist没有   USERPROFILE"

我无法弄清楚如何进行注册以同时为他创建用户和个人资料。   我知道之前已经问过这个问题,但是我没有找到任何可以解释为什么会发生这种情况的问题。我正在寻找一个使用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)

2 个答案:

答案 0 :(得分:4)

这里的

RelatedObjectDoesNotExist错误意味着创建User对象时信号不会创建相应的UserProfile对象。基于问题中的片段,可能是因为信号的定义方式如何:

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个对象。

答案 1 :(得分:1)

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

profile = instance.userprofile

应该是:

profile = instance.profile