Как переопределить действие обновления в ModelViewSet в django rest framework?
Это демонстрационные модели
class Author(models.Model):
name = models.CharField(max_lenght=5)
class Post(models.Model):
parent = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_lenght=50)
body = models.TextField()
Соответствующие мнения таковы
class AuthorViewSet(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorSerializer
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostStatSerializer
Я пытаюсь выполнить действие update/put на PostViewSet, которое успешно выполняется, но я ожидаю другого вывода. После успешного обновления записи Post я хочу отправить ее запись Author в качестве вывода с помощью AuthorSerializer. Как переопределить это и добавить эту функциональность?
Вы можете переопределить метод update
для этого:
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostStatSerializer
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
# this will return autor's data as a response
return Response(AuthorSerializer(instance.parent).data)
Я придумал, как исправить мою проблему с помощью меньшего кода.
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostStatSerializer
def update(self, request, *args, **kwargs):
super().update(request, *args, **kwargs)
instance = self.get_object()
return Response(AuthorSerializer(instance.author).data)