Почему метод create не вызывается в сериализаторе django? - PullRequest
0 голосов
/ 28 мая 2020

Я хочу иметь возможность отправлять запись в 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')

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Вы пытаетесь поместить все в свою @action() функцию, как если бы это была новая viewsets.ModelViewSet. Это не работает.

Если вы хотите иметь все mixins из viewsets.ModelViewSet, вам нужно создать отдельный ModelViewSet или повторно реализовать все методы в вашем действии (см. В вашем image_tags(), метод HTTP даже не используется)

1 голос
/ 28 мая 2020

Метод .create() не вызывается, потому что вы не создаете, а обновляете экземпляр. Для создания экземпляра используйте:

serializer = ImageTagSerializer(data=request.data)

1 голос
/ 28 мая 2020

Поскольку вы также передаете экземпляр при инициализации сериализатора.

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

Здесь capture - это Пример модели, в то время DRF считает, что это операция обновления , следовательно, DRF использует метод сериализатора update(...).

...