Django 创建时在DRF中上载多部分图像

Django 创建时在DRF中上载多部分图像,django,django-forms,django-rest-framework,image-uploading,multipartform-data,Django,Django Forms,Django Rest Framework,Image Uploading,Multipartform Data,我想有一个模型,你可以上传到createpost多个图像 在api/animals上的DRF web视图中/在post表单中,我想添加多个图像,并创建带有附加图像的新动物 假设我有以下模型: 我有以下序列化程序: 我有以下rest视图: 当我使用drf web界面时: 我通过重写create方法并使图像为只读解决了这个问题: class AnimalSerializer(serializers.HyperlinkedModelSerializer): images = AnimalI

我想有一个模型,你可以上传到createpost多个图像

在api/animals上的DRF web视图中/在post表单中,我想添加多个图像,并创建带有附加图像的新动物

假设我有以下模型:

我有以下序列化程序:

我有以下rest视图:

当我使用drf web界面时:


我通过重写create方法并使图像为只读解决了这个问题:

class AnimalSerializer(serializers.HyperlinkedModelSerializer):

     images = AnimalImageSerializer(many=True, read_only=True)

     def create(self, validated_data):
         images_data = self.context['request'].FILES
         animal = Animal.objects.create(
             slug=validated_data.get('slug', 'default-slug')
         )
         for image_data in images_data.getlist('file'):
             AnimalImage.objects.create(animal=animal, image=image_data)

     class Meta:
         model = Animal
         lookup_field = 'slug'
         extra_kwargs = {
             {'url': {'lookup_field': 'slug'}
         }
         fields = ('slug', 'images', )
还要确保从ModelViewSet中删除JsonParser

JSONParser
确保如果使用Postman,则只使用body的表单数据类型

还要确保添加了创建模型所需的所有字段,即Animal

不要添加images字段,并在序列化程序中将其设置为只读

创建一个新字段并将其称为file,并将其类型设置为file而不是Text

该字段的名称必须为file,因为您将使用getlist“file”。名称必须相同。这就是把我搞砸的原因


我通过重写create方法并使图像为只读解决了这个问题:

class AnimalSerializer(serializers.HyperlinkedModelSerializer):

     images = AnimalImageSerializer(many=True, read_only=True)

     def create(self, validated_data):
         images_data = self.context['request'].FILES
         animal = Animal.objects.create(
             slug=validated_data.get('slug', 'default-slug')
         )
         for image_data in images_data.getlist('file'):
             AnimalImage.objects.create(animal=animal, image=image_data)

     class Meta:
         model = Animal
         lookup_field = 'slug'
         extra_kwargs = {
             {'url': {'lookup_field': 'slug'}
         }
         fields = ('slug', 'images', )
还要确保从ModelViewSet中删除JsonParser

JSONParser
确保如果使用Postman,则只使用body的表单数据类型

还要确保添加了创建模型所需的所有字段,即Animal

不要添加images字段,并在序列化程序中将其设置为只读

创建一个新字段并将其称为file,并将其类型设置为file而不是Text

该字段的名称必须为file,因为您将使用getlist“file”。名称必须相同。这就是把我搞砸的原因


这个答案是通过与Django REST框架的ForeignKey反向关系上传多个图像的最简单解决方案。我花了一天时间挖掘,想找到另一条路。不要浪费你的时间,相信我。我找到了另一种方案的解决方案,在这种方案中,您可以上载多个带有表单数据的图像,验证并发送嵌套的json。您可以查看我的答案,这是通过与Django REST框架的ForeignKey反向关系上传多个图像的最简单解决方案。我花了一天时间挖掘,想找到另一条路。不要浪费你的时间,相信我。我找到了另一种方案的解决方案,在这种方案中,您可以上载多个带有表单数据的图像,验证并发送嵌套的json。你可以检查我的电脑。
JSONParser