Как добавить редактирование профилей пользователей в Django DRF?

Добавление функционала редактирования профилей пользователей в Django REST framework (DRF) можно реализовать следующим образом:

1. Необходимо создать сериализатор для модели пользователя (User) и профиля пользователя (Profile), если профиль вынесен в отдельную модель. Ниже приведен пример кода для сериализаторов:

# serializers.py

from rest_framework import serializers
from django.contrib.auth.models import User
from .models import Profile

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = '__all__'

class UserSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer()

    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'profile']

    def update(self, instance, validated_data):
        profile_data = validated_data.pop('profile')
        profile = instance.profile

        instance.email = validated_data.get('email', instance.email)
        instance.save()

        profile.bio = profile_data.get('bio', profile.bio)
        profile.save()

        return instance

2. Далее необходимо создать представление (view) для обновления профиля пользователя. Ниже приведен пример кода для представления:

# views.py

from rest_framework.generics import UpdateAPIView
from rest_framework.permissions import IsAuthenticated
from django.contrib.auth.models import User
from .serializers import UserSerializer

class ProfileUpdateView(UpdateAPIView):
    serializer_class = UserSerializer
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        return User.objects.filter(id=self.request.user.id)

3. Настройте маршруты в файле urls.py:

# urls.py

from django.urls import path
from .views import ProfileUpdateView

urlpatterns = [
    path('profile/', ProfileUpdateView.as_view(), name='profile-update'),
]

4. Теперь при отправке PATCH или PUT запроса на URL /profile/ с данными вида:

{
    "username": "new_username",
    "email": "[email protected]",
    "profile": {
        "bio": "New bio information"
    }
}

профиль пользователя будет обновлен в соответствии с переданными данными.

Это только базовый пример. Можно добавить дополнительную логику в представление или сериализатор для обработки различных случаев или валидации данных.