Проект, над которым я сейчас работаю, требует разрешения пользователю обновлять информацию о пользователе вместе с информацией о профиле пользователя. Я следовал инструкциям на странице часто задаваемых вопросов 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'
}