简体   繁体   English

如何在 Django REST 框架中覆盖 viewsets.ModelViewSet?

[英]How do I override viewsets.ModelViewSet in Django REST Framework?

So my model is simple as所以我的 model 很简单

class Face(models.Model):
    uid = models.CharField(max_length=510, primary_key=True)
    photo = models.ImageField(upload_to='face_photos')

serializer串行器

class FaceSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Face
        fields = ['uid', 'photo']
        extra_kwargs = {'uid': {'required': True}, 'photo': {'required': True}}

and view should be something like和视图应该是这样的

class FaceViewSet(viewsets.ModelViewSet):
    queryset = Face.objects.all()
    serializer_class = FaceSerializer
    permission_classes = [permissions.AllowAny]

And it works.它有效。 However:然而:

  1. I don't want list, update, delete options.我不想列出、更新、删除选项。 Only POST and GET.只有 POST 和 GET。
  2. I want to add my logic on post, so if uid exists then update, else create... as well other processing.我想在帖子中添加我的逻辑,所以如果uid存在则更新,否则创建......以及其他处理。
  3. I want custom response after the POST.我想要 POST 后的自定义响应。

How do I achieve this all not loosing all the goodies that viewsets.ModelViewSet provides, like validations, auto generated HTML fields in Rest API web view, etc? How do I achieve this all not loosing all the goodies that viewsets.ModelViewSet provides, like validations, auto generated HTML fields in Rest API web view, etc?

This worked for me:这对我有用:

class FaceViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
    """
    API endpoint for adding and processing new client (by uid) face
    """
    queryset = Face.objects.all()
    serializer_class = FaceSerializer
    permission_classes = [permissions.AllowAny]

    def create(self, request):
        if "uid" in request.POST:
            try:
                instance = Face.objects.get(pk=request.POST['uid'])
                serializer = FaceSerializer(
                    instance=instance,
                    data=request.data
                )
            except Face.DoesNotExist:
                serializer = FaceSerializer(data=request.data)
        else:
            serializer = FaceSerializer(data=request.data)

        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data)

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = FaceSerializer(instance=instance)
        return Response(serializer.data)

for number one you can use this:对于第一,你可以使用这个:

http_method_names = ['get','post']

buth get method also cintains list method但是 get 方法也包含 list 方法

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

相关问题 Django Rest 框架视图集.ModelViewSet - Django Rest Framework viewsets.ModelViewSet 如何配置 viewsets.ModelViewSet 以使用在请求正文中传递的参数进行过滤。 (Django 休息框架) - How do I configure viewsets.ModelViewSet to filter using arguments passed in the body of the request. (Django Rest Framework ) 如何覆盖 django rest 框架 ModelViewSet 中的更新操作? - How to override the update action in django rest framework ModelViewSet? 在viewsets.ModelViewSet上获取params验证 - Get params validation on viewsets.ModelViewSet django rest 框架中对 ModelViewSet 的 PATCH 请求 - 如何实现 serializer.update()? - PATCH request to ModelViewSet in django rest framework - how do I implement serializer.update()? django rest框架中viewset的使用 - use of viewsets in django rest framework Django REST框架字典到视图集 - Django REST framework dict to viewsets django rest框架-使用视图集 - django rest framework - using viewsets 如何覆盖 django rest 框架 ModelViewSet 的创建操作以创建批量记录? - How to override create action of django rest framework ModelViewSet to create bulk records? 为什么我不能在 Django Rest Framework 的 ModelViewSet 上使用 @action 装饰器 - Why I cannot use @action decorator on ModelViewSet in Django Rest Framework
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM