我如何接受django Rest框架中的base64图像列表

问题描述 投票:0回答:1

所以我试图通过端点接受多个base64图像来创建帖子,这是我想要发送的对象虚拟数据。

{
    "user": "username of the user",
    "caption": "Reasons why my Husky got mad at me today.",
    "location": "location of the post",
    "tags": [],
    "hashtags": [{"name":"Husky"}, {"name":"Angry_husky"}],
    "images": [
        {
            "image_name": "image.png",
            "image_base64": "base64_string"
        },
{
            "image_name": "image2.png",
            "image_base64": "base64_string"
        }
    ]

}

这是我的模型:

class Hashtag(models.Model):
    name = models.CharField(max_length=100, unique=True)


class Post(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    caption = models.TextField(_("Caption"), max_length=5000, null=True)
    location = models.CharField(_("Location"), blank=True, max_length=255)
    is_deleted = models.BooleanField(_("Is Deleted"), default=False)
    likes = models.ManyToManyField(
        CustomUser, related_name="liked_posts", blank=True, verbose_name=_("Liked By")
    )
    tags = models.ManyToManyField(
        CustomUser,
        related_name="tagged_users",
        blank=True,
        verbose_name=_("Tagged Users"),
    )
    hashtags = models.ManyToManyField(
        Hashtag, related_name="posts", blank=True, verbose_name=_("Hashtags")
    )
    date_posted = models.DateTimeField(_("Date Posted"), auto_now_add=True)

    class Meta:
        ordering = ["-date_posted"]


class Image(models.Model):
    post = models.ForeignKey(
        Post, null=True, on_delete=models.CASCADE, related_name="images"
    )
    image_name = models.CharField()
    image = models.ImageField(_("Image"), upload_to="post_images/", null=True)

这是我的序列化器:

class HashtagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Hashtag
        fields = ["name"]


class ImageSerializer(serializers.ModelSerializer):
    image = Base64ImageField()

    class Meta:
        model = Image
        fields = "__all__"


class PostCreateSerializer(serializers.ModelSerializer):
    user = serializers.CharField()
    hashtags = HashtagSerializer(many=True)
    images = ImageSerializer(many=True, read_only=True)

    class Meta:
        model = Post
        fields = [
            "user",
            "caption",
            "location",
            "tags",
            "hashtags",
            "images",
        ]
        extra_kwargs = {
            "location": {"required": False},
            "hashtags": {"required": False},
            "tags": {"required": False},
        }

    def create(self, validated_data):
        username = validated_data.pop("user")
        hashtags_data = validated_data.pop("hashtags", [])
        images_data = validated_data.pop("images", [])
        tags_data = validated_data.pop("tags", [])

        user = CustomUser.objects.get(username=username)

        post = Post.objects.create(
            user=user,
            caption=validated_data.get("caption"),
            location=validated_data.get("location"),
        )

        for hashtag_data in hashtags_data:
            hashtag, created = Hashtag.objects.get_or_create(name=hashtag_data)
            if hashtag:
                post.hashtags.add(hashtag.id)
            else:
                post.hashtags.add(created)

        for tag_data in tags_data:
            tagged_user = CustomUser.objects.get(username=tag_data)
            post.tags.add(tagged_user.id)

        for image_data in images_data:
            image = Image.objects.create(post=post, image_name=image_data['image_name'])
            image.image.save(
                f"{image_data['image_name']}.jpg", ContentFile(base64.b64decode('image_bas64'))
            )

        post.save()
        return post

这是我的观点:

class PostCreateView(generics.CreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostCreateSerializer
    permission_classes = [IsAuthenticated]

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

问题是我不知道如何解决这个问题,我已经搜索过,但没有一个符合我的要求。我想首先将照片保存到默认的 Django 媒体管理系统,成功后我将使用 s3 存储桶 请我需要更有经验的 django 开发人员的帮助。

python python-3.x django serialization base64
1个回答
0
投票
for image_data in images_data:
    image_serializer = ImageSerializer(data=image_data)
    if image_serializer.is_valid():
       image_instance = image_serializer.save(post=post)
    else:
               
       raise serializers.ValidationError("Error saving images")

在 PostCreateSerializer 的 create 方法中,您为请求中提供的每个图像数据创建 ImageSerializer。如果序列化器有效,则保存图像。

© www.soinside.com 2019 - 2024. All rights reserved.