django-rest-auth创建用户个人资料

时间:2020-04-10 14:59:43

标签: python django django-rest-framework django-registration django-rest-auth

我正在使用django-rest-auth处理登录和注册。我偶然发现的问题是我想向默认的django User model添加一些自定义字段。我已经看到他们在他们的文档中介绍了这一点,并且我尝试从here复制他们的示例,但是当我从用户个人资料向新创建的字段提出PUT请求时,出现此错误:

RelatedObjectDoesNotExist at /rest-auth/user/
User has no userprofile.
Request Method: PUT
Request URL:    http://localhost:8000/rest-auth/user/
Django Version: 2.2.10
Exception Type: RelatedObjectDoesNotExist
Exception Value:    
User has no userprofile.
Exception Location: /home/terkea/django_react_template/src/venv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py in __get__, line 415
Python Executable:  /home/terkea/django_react_template/src/venv/bin/python
Python Version: 3.6.9
Python Path:    
['/home/terkea/django_react_template/src',
 '/usr/lib/python36.zip',
 '/usr/lib/python3.6',
 '/usr/lib/python3.6/lib-dynload',
 '/home/terkea/django_react_template/src/venv/lib/python3.6/site-packages']
Server time:    Fri, 10 Apr 2020 14:56:41 +0000

这是我的模特

from django.db import models
from django.conf import settings
from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    company_name = models.CharField(max_length=100, default=None)

这是我的序列化器:

from rest_framework import serializers
from rest_auth.serializers import UserDetailsSerializer


class UserSerializer(UserDetailsSerializer):

    company_name = serializers.CharField(source="userprofile.company_name")

    class Meta(UserDetailsSerializer.Meta):
        fields = UserDetailsSerializer.Meta.fields + ('company_name',)

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

        instance = super(UserSerializer, self).update(instance, validated_data)

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

我假设必须在用户同时创建用户配置文件条目,但是我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

from django.db import models
from django.conf import settings
from django.contrib.auth.models import User

from django.db.models.signals import post_save
from django.dispatch import receiver

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    company_name = models.CharField(max_length=100, default=None)

@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)

这解决了我的问题