django -rest-auth создать userprofile - PullRequest
0 голосов
/ 10 апреля 2020

Я использую django -rest-auth для обработки входа и регистрации. Проблема, с которой я столкнулся, заключается в том, что я хотел бы добавить некоторые пользовательские поля в значение по умолчанию django User model. Я видел, как они покрывали это в своих документах, и я попытался воспроизвести их пример из здесь , но когда я делаю запрос PUT для вновь созданного поля из userprofile, я получаю эту ошибку:

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

Я предполагаю, что запись userprofile должна быть создана одновременно, когда пользователь, но я не знаю, как именно я должен это сделать.

1 Ответ

0 голосов
/ 10 апреля 2020
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)

это решило мою проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...