【问题标题】:How to update post with multiple images in django rest framework?如何在 django rest 框架中使用多个图像更新帖子?
【发布时间】:2020-08-06 07:23:28
【问题描述】:

我是 django rest 框架的初学者,我有这段代码来更新包含多张图片的帖子,但是上传多张图片无法正常工作并且图片没有被保存。在创建帖子时,我能够使多个上传部分正常工作。我怎样才能让这个序列化程序接收多个图像?

谢谢!非常感谢您的帮助。

序列化器

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/')

【问题讨论】:

  • 您的PostPostImage 模型看起来如何?
  • 嘿,我已经更新了两个模型的问题。

标签: django django-models django-rest-framework django-forms django-views


【解决方案1】:

覆盖 PostUpdateSerializer 序列化程序类的 update(...) 方法

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()

    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)

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

默认情况下,此 update() 方法追加图片到现有帖子。

您可以使用clear_existing_images(...)方法从数据库以及存储位置清除现有图像。

更新-1

要限制图像,请使用 max_length 参数作为

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

【讨论】:

  • 谢谢..我应该删除更新序列化程序中的验证功能吗?
  • 是否可以限制上传的图片数量......就像我们如何使用内联或模态表单一样?
  • 是的,您应该删除验证功能,因为它在那里什么都不做。
  • 查看update-1 部分,了解如何限制图像。
  • 哦..好的,谢谢
猜你喜欢
  • 2018-09-15
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
相关资源
最近更新 更多