简体   繁体   English

如何覆盖 django rest 框架 ModelViewSet 中的更新操作?

[英]How to override the update action in django rest framework ModelViewSet?

These are the demo models这些是演示模型

class Author(models.Model):
    name = models.CharField(max_lenght=5)

class Post(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    title = models.CharField(max_lenght=50)
    body = models.TextField()

And the respective views are各自的观点是

class AuthorViewSet(viewsets.ModelViewSet):
    queryset = Author.objects.all()
    serializer_class = AuthorSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostStatSerializer

I am trying to perform an update/put action on PostViewSet and which is succesfull, but I am expecting different output.我正在尝试对 PostViewSet 执行更新/放置操作并且成功,但我期待不同的 output。 After successful update of Post record, I want to send its Author record as output with AuthorSerializer.成功更新 Post 记录后,我想使用 AuthorSerializer 将其作者记录发送为 output。 How to override this and add this functionality?如何覆盖这个并添加这个功能?

I figured out some less code fix for my issue.我为我的问题找到了一些更少的代码修复。

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)

You can override update method for this:您可以为此覆盖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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何覆盖 django rest 框架 ModelViewSet 的创建操作以创建批量记录? - How to override create action of django rest framework ModelViewSet to create bulk records? 如何在 Django REST 框架中覆盖 viewsets.ModelViewSet? - How do I override viewsets.ModelViewSet in Django REST Framework? DJango REST框架:如何使用ModelViewSet编写创建,列表,更新和删除 - DJango REST Framework: How to write Create, List, Update and Delete with ModelViewSet 为什么我不能在 Django Rest Framework 的 ModelViewSet 上使用 @action 装饰器 - Why I cannot use @action decorator on ModelViewSet in Django Rest Framework 如何在Django REST Framework中将变量从ModelSerializer.update()传递到ModelViewSet.update() - How to pass a variable from ModelSerializer.update() to ModelViewSet.update() in Django REST Framework django rest 框架中对 ModelViewSet 的 PATCH 请求 - 如何实现 serializer.update()? - PATCH request to ModelViewSet in django rest framework - how do I implement serializer.update()? 如何在django-rest-framework的modelviewset中取消设置csrf? - How to unset csrf in modelviewset of django-rest-framework? 如何在django rest框架中将多个变量传递给modelViewSet? - How to pass more than one variables to modelViewSet in django rest framework? 使用带有Django Rest Framework的ModelViewSet中的自定义函数 - Use custom function in ModelViewSet with Django Rest Framework 不能PUT ModelViewSet Django Rest Framework - Can't PUT ModelViewSet Django Rest Framework
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM