Он думает, что request.data['images']
нужно будет немного изменить, потому что ваш PostImageSerializer
будет ожидать объект, содержащий клавишу "image", в то время как вы передаете список TemporaryUploadedFile
.
Given request.data['images']
Вы можете сделать что-то вроде следующего в своем представлении, прежде чем передавать данные в сериализатор:
images_list: List[TemporaryUploadedFile] = request.data.pop("images")
images = []
for image in images_list:
images.append({
"image": image,
})
request.data["images"] = images
Итак, мы преобразуем ваш список TemporaryUploadedFiles
в список объектов с помощью ключа изображения.
: edit: То есть вы не хотите преобразовывать данные в представлении, чтобы они были совместимы с сериализатором?Затем вы можете изменить сериализатор, чтобы он был совместим с данными, это включает в себя настройку методов create
и update
, сейчас я покажу вам, как переопределить метод create
.
class CreatePostSerializer(serializers.ModelSerializer):
images = serializers.ImageField(many=True)
class Meta:
model = Post
fields = ('id', 'url', 'content', 'images',)
read_only_fields = ('created_by',)
depth = 1
def create(self, validated_data):
images = validated_data.pop("images")
post = super().create(validated_data)
for image in images:
serializer = PostImageSerializer(data={"image": image, "post": post.pk}, context=self.context)
serializer.is_valid()
serializer.save()
return post
То есть вы не хотите переопределять данные в запросе и не хотите настраивать метод создания сериализаторов?Измените, как сериализатор преобразует ваши исходные данные в проверенные данные с помощью метода validate
(я думаю, это работает для вложенных сериализаторов, но его не тестировали):
class CreatePostSerializer(serializers.ModelSerializer):
images = PostImageSerializer(many=True, required=False)
class Meta:
model = Post
fields = ('id', 'url', 'content', 'images',)
read_only_fields = ('created_by',)
depth = 1
def validate(self, attrs):
images_list = attrs.pop("images")
images = []
for image in images_list:
images.append({
"image": image,
})
attrs["images"] = images
return attrs