Как принять список изображений 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")
В методе create PostCreateSerializer вы создаете ImageSerializer для каждого изображения, предоставленного в запросе. Если сериализатор действителен, вы сохраняете изображение.