我正在使用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
我假设必须在用户同时创建用户配置文件条目,但是我不知道该怎么做。
答案 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)
这解决了我的问题