Как принять список изображений base64 во фреймворке django rest

Итак, я пытаюсь принять несколько изображений 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.

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

In the create method of PostCreateSerializer, you create the ImageSerializer for each image data provided in the request. If the serializer is valid, you save the image.

Вернуться на верх