Django Rest Framework. Создание / обновление нескольких изображений и сериализация - PullRequest
0 голосов
/ 03 марта 2020

Я довольно новичок в разработке API с django инфраструктурой отдыха. Я работал над задачей около недели. Я чувствую, что все ближе, но все еще сталкиваюсь с проблемами. У меня есть модель Listing и модель Image. Каждый список может иметь несколько изображений. Моя Image модель имеет только два поля: photo, которое является полем изображения, и listing, которое является ForeignKey списком

Мои сериализаторы выглядят как

class ImageSerializerForListingDetail(serializers.ModelSerializer):
    class Meta:
        model = Image
        fields = ('photo', )

    def get_image_url(self, listing):
        return listing.photo.url
`
class ListingSerializer(serializers.HyperlinkedModelSerializer):
    user = UsernameSerializer(read_only=True)
    image_set = ImageSerializerForListingDetail(many=True, required=False)

    class Meta:
        model = Listing
        exclude = ('url', )
        depth = 1

    def create(self, validated_data):
        images_data = self.context.get('view').request.FILES
        listing = Listing.objects.create(**validated_data)
        for image_data in images_data.values():
            Image.objects.create(photo=image_data, listing=listing)
        return listing

    def update(self, instance, validated_data):
        images_data = validated_data.pop('image_set')
        images = instance.image_set.all()
        images = list(images)
        instance = validated_data.get(**validated_data)
        instance.save()
        for image_data in images_data:
            image = images.pop(0)
            image.photo = image_data.get('photo')
            image.listing = image_data.get('listing')
            image.save()
        return instance

Мой ViewSet выглядит следующим образом ...

class ListingViewSet(viewsets.ModelViewSet):
    queryset = Listing.objects.all().order_by('id')
    permission_classes = [IsOwnerOrReadOnly, ]
    serializer_classes = {
        'list': ListingListSerializer,
        'retrieve': ListingSerializer
    }
    default_serializer_class = ListingSerializer

    def get_serializer_class(self):
        return self.serializer_classes.get(self.action, self.default_serializer_class)

Я проверяю запрос PATCH в почтальоне, но у меня ошибка,

images_data = validated_data.pop('image_set')
KeyError: 'image_set'

Любая помощь, чтобы получить этот запрос исправления исправлена, поэтому пользователь может создавать / редактировать изображения для каждого списка будет принята с благодарностью. Спасибо всем! (отредактировано)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...