所以我试图通过端点接受多个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")
在 PostCreateSerializer 的 create 方法中,您为请求中提供的每个图像数据创建 ImageSerializer。如果序列化器有效,则保存图像。