Создание вложенных данных в сериализаторе Django Rest Framework
возникла проблема при создании вложенных данных в сериализаторе Django Rest Framework. Я хочу, чтобы при передачи в request.data полей «slug» и «schedules» создавалась запись в БД с этими данными + «author» равен request.user.
Моя попытка:
models.py
class ShareLink(models.Model):
slug = models.SlugField(blank=False)
schedules = models.TextField(blank=False)
author = models.OneToOneField(User, on_delete=models.CASCADE, blank=False)
users = models.ManyToManyField(User, related_name='sharelinks_used', blank=True)
views = models.IntegerField(default=0)
is_deleted = models.BooleanField(default=False)
def __str__(self):
str = 'ShareLink: id: {}, slug: {}'.format(self.id, self.slug)
return str
serializers.py
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = ('schedules', 'photos', 'is_deleted', 'is_banned')
...
class UserSerializer(serializers.ModelSerializer):
profile = ProfileSerializer(
many=False,
read_only=True
)
class Meta:
model = User
fields = ('id', 'username', 'password', 'email', 'profile')
...
class ShareLinkSerializer(serializers.ModelSerializer):
class Meta:
model = ShareLink
fields = ('id', 'slug', 'schedules', 'author', 'users', 'views', 'is_deleted')
views.py
class ShareLinkCreate(APIView):
def post(self, request):
serializer = ShareLinkSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data(), status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Ошибка:
— Отправляю POST-запрос с form-data, где slug = "some slug", schedules = "some schedules".
Ответ:
{
"author": [
"This field is required."
]
}
Прошу помочь с данным вопросом. Заранее спасибо!
Ответы (1 шт):
Автор решения: floydya
→ Ссылка
Делаем поле только для чтения и при создании нового экземпляра - прокидываем автора из контекста запроса.
class ShareLinkSerializer(serializers.ModelSerializer):
author = serializers.ReadOnlyField()
class Meta:
model = ShareLink
fields = ('id', 'slug', 'schedules', 'author', 'users', 'views', 'is_deleted')
def create(self, validated_data):
validated_data['author'] = self.context['request'].user
return super(ShareLinkSerializer, self).create(validated_data)
Чтобы не заморачиваться с вьюхой(прокидывать контекст в сериализатор вручную) - можно использовать CreateAPIView:
from rest_framework import permissions, generics
class ShareLinkCreate(generics.CreateAPIView):
serializer_class = ShareLinkSerializer
# Разрешаем доступ только авторизованным,
# т.к. при создании анонимным пользователем - в сериализаторе будет ошибка
permission_classes = (permissions.IsAuthenticated,)