Возникли проблемы с расширением UserDetailSerialzer в django -rest-auth - PullRequest
0 голосов
/ 08 мая 2020

Проект, над которым я сейчас работаю, требует разрешения пользователю обновлять информацию о пользователе вместе с информацией о профиле пользователя. Я следовал инструкциям на странице часто задаваемых вопросов django -rest-auth о том, как расширить UserDetailSerializer, чтобы разрешить это https://django-rest-auth.readthedocs.io/en/latest/faq.html, но когда я тестирую методы обновления локально, я получаю следующую ошибку:

(0.005) QUERY = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."expire_date" > %s AND "django_session"."session_key" = %s)' - PARAMS = (datetime.datetime(2020, 5, 8, 1, 44, 9, 588358), '2f8sxtig4ajxjvylyl4naa6bv6ibjk49'); args=(datetime.datetime(2020, 5, 8, 1, 44, 9, 588358), '2f8sxtig4ajxjvylyl4naa6bv6ibjk49')
(0.003) QUERY = 'SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."id" = %s' - PARAMS = (1,); args=(1,)
Bad Request: /rest-auth/user/
"PUT /rest-auth/user/ HTTP/1.1" 400 73

Мой код для сериализатора:

from rest_framework.validators import UniqueValidator
from django.contrib.auth.models import User


class UserSerializer(UserDetailsSerializer):

    dob = serializers.CharField(source="profile.dob")
    bio = serializers.CharField(source="profile.bio")
    profile_link = serializers.URLField(source="profile.profile_link")

    class Meta(UserDetailsSerializer.Meta):
        fields = UserDetailsSerializer.Meta.fields + ('dob', 'bio', 'profile_link')

    def update(self, instance, validated_data):
        profile_data = validated_data.pop('profile', {})
        dob = profile_data.get("profile.dob")
        bio = profile_data.get("profile.bio")
        profile_link = profile_data.get("profile.profile_link")

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

        # get and update user profile
        profile = instance.profile
        if profile_data and dob:
            profile.dob = dob
            profile.save()
        if profile_data and bio:
            profile.bio = bio
            profile.save()
        if profile_data and profile_link:
            profile.profile_link = profile_link
            profile.save()
        return instance

Мой код для модели UserProfile:

class UserProfile(models.Model):
    user = models.OneToOneField(User, related_name="profile", on_delete=models.CASCADE)
    dob = models.DateField(blank=True)
    bio = models.TextField(blank=True)
    profile_link = models.URLField(blank=True)

    def __unicode__(self):
        return self.user.username

    class Meta:
        ordering = ["user"]

Мои настройки:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',

    'allauth',
    'allauth.account',
    'rest_auth',
    'rest_auth.registration',

    'rest_framework',
    'rest_framework.authtoken',

    'myapp.usermanagement',
]
REST_FRAMEWORK = {

    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
    ],
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
    ]

}

REST_AUTH_SERIALIZERS = {
    'USER_DETAILS_SERIALIZER': 'myapp.usermanagement.serializers.UserSerializer'
}
...