如何在Django REST框架中重写viewsets.ModelViewSet?

2024-10-02 02:34:16 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我的模型很简单

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

序列化程序

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

视图应该是这样的

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

它是有效的。然而:

  1. 我不想要列表、更新、删除选项。只发布和获取
  2. 我想在post上添加我的逻辑,所以如果uid存在,则更新,否则创建。。。以及其他处理
  3. 我想在发布后定制回复

如何在不失去viewsets.ModelViewSet提供的所有优点(如验证、RESTAPI web视图中自动生成的HTML字段等)的情况下实现这一切


Tags: 模型视图trueuidmodelmodelsrequiredmax
1条回答
网友
1楼 · 发布于 2024-10-02 02:34:16

这对我很有用:

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)

相关问题 更多 >

    热门问题