首页 > 解决方案 > 为什么在 django 序列化程序中不调用 create 方法?

问题描述

我希望能够一一发布到 ManyToManyField (ImageTag) 的条目。我正在使用额外的操作在图像下创建一个嵌套端点。

我希望能够一次发布一个 POST 条目。

localhost:8000/my_app/images/IMG_123/image_tags/

我想重写序列化器上的 create 方法来做到这一点。但问题是它没有被调用。为什么?

这是我的源代码:

#models.py
class ImageTag(models.Model):
    name = models.CharField()
    description = models.CharField()

class Image(models.Model):
    image_id = models.CharField(unique=True)
    image_tags = models.ManyToManyField(ImageTag, blank=True)
    ...

#serializers.py
class ImageSerializer(serializers.ModelSerializer):

    class Meta:
        model = Image
        fields = '__all__'

class ImageTagSerializer(serializers.ModelSerializer):
    image_tags = serializers.StringRelatedField(many=True)

    class Meta:
        model = Image
        fields = ('image_tags',)

    def to_internal_value(self, data):
        return data

    def create(self, validated_data):
        print("GOTHERE")
        print("VALI", validated_data)
        return validated_data

#views.py
class ImageExtraAction(viewsets.ModelViewSet):

    @action(detail=True, methods=['get', 'post', 'delete'])
    def image_tags(self, request, capture_id=None):
        capture = self.get_object()

        serializer = ImageTagSerializer(capture, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class ImageTagViewSet(ImageExtraAction, viewsets.ModelViewSet):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer
    lookup_field = 'image_id'
    ...

#urls.py
router.register(r'images', ImageTagViewSet, basename='image')

标签: djangodjango-rest-framework

解决方案


因为您在初始化序列化程序时也传递了实例。

serializer = ImageTagSerializer(capture, data=request.data)

这里,capture是模型实例,当时DRF认为这是一个更新操作,因此,DRF使用update(...)了序列化器的方法。


推荐阅读