Как переопределить действие обновления в 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)
Вернуться на верх