Как обновить пост с несколькими изображениями в django rest framework? - PullRequest
0 голосов
/ 06 августа 2020

Я новичок с django rest framework, у меня есть этот код для обновления сообщения с несколькими изображениями, но загрузка нескольких изображений не работает должным образом, и изображение не сохраняется. Создавая пост, я смог заставить работу с несколькими загрузками работать нормально. Как я могу заставить этот сериализатор принимать несколько изображений?

Спасибо! Помощь будет очень принята.

сериализатор

class PostImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = PostImage
        fields = ['id', 'images',]

class PostUpdateSerializer(serializers.ModelSerializer):
    images = serializers.ListField(child=serializers.ImageField(allow_empty_file=True))
    class Meta:
        model = Post
        fields = ['id','title', 'image', 'images',] #images is from another model POSTIMAGE

    def validate(self, post):
        try:
            title = post['title']
            image = post['image']
            images = post['images']
        except KeyError:
            pass
        return post

просмотров.

def update_post_api_view(request, slug):
    if request.method == 'GET':
        try:
            post = Post.objects.get(slug=slug)
        except Post.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        serializer = PostSerializer(post)
        return Response(serializer.data, status=status.HTTP_200_OK)
    if request.method == 'PUT': 
        try:
            post = Post.objects.get(slug=slug)
        except Post.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        user = request.user
        if post.user != user:
            return Response({'response': "You can't edit the post!"})

        serializer = PostUpdateSerializer(post, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            data = {
            'success': 'update successful',
            }
            return Response(data=data)

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

Это модель ..

class Post(models.Model):
    title = models.TextField(max_length=5000, blank=False, null=False)
    image = models.ImageField(upload_to='posts/postimage/', null=True)
    post_date = models.DateTimeField(auto_now_add=True, verbose_name="Date Posted")
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    slug = models.SlugField(blank=True, unique=True, max_length=255)

class PostImage(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    images = models.ImageField(upload_to='posts/postimage/')

1 Ответ

0 голосов
/ 09 августа 2020

Заменить метод update(...) класса сериализатора PostUpdateSerializer

class PostUpdateSerializer(serializers.ModelSerializer):
    images = serializers.ListField(child=serializers.ImageField(allow_empty_file=True))

    def clear_existing_images(self, instance):
        for post_image in instance.postimage_set.all():
            post_image.images.delete()
            post_image.delete()

    <b>def update(self, instance, validated_data):
        images = validated_data.pop('images', None)
        if images:
            # self.clear_existing_images(instance) # uncomment this if you want to clear existing images.
            post_image_model_instance = [PostImage(post=instance, images=image) for image in images]
            PostImage.objects.bulk_create(
                post_image_model_instance
            )
        return super().update(instance, validated_data)</b>

    class Meta:
        model = Post
        fields = ['id', 'title', 'image', 'images', ]

По умолчанию это update() метод добавлять изображения к существующим сообщениям.

Вы можете использовать метод clear_existing_images(...) для удаления существующих изображений из базы данных, а также из место хранения.

Update-1

, чтобы ограничить количество изображений, используйте аргумент max_length как

serializers.ListField(child=serializers.ImageField(allow_empty_file=True), <b>max_length=2</b>)
...