【问题标题】:Multipart Image Upload in DRF on CREATECREATE 上 DRF 中的多部分图像上传
【发布时间】:2019-06-19 15:03:04
【问题描述】:

我想要一个模型,您可以在创建(发布)时上传多个图像。

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

假设我有以下模型:

class Animal(models.Model):
    slug = models.CharField(max_length=20, unique=True)


class AnimalImage(models.Model):
    animal = models.ForeignKey(Animal, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='animal_pics/')

我有以下序列化程序:

class AnimalImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = AnimalImage
        fields = ('animal', 'image', )


class AnimalSerializer(serializers.HyperlinkedModelSerializer):
     images = AnimalImageSerializer(many=True)
     class Meta:
         model = Animal
         lookup_field = 'slug'
         extra_kwargs = {
             {'url': {'lookup_field': 'slug'}
         }
         fields = ('slug', 'images', )

我有以下休息观点:

 class AnimalViewSet(viewsets.ModelViewSet):
     queryset = Animal.objects.all()
     serializer_class = AnimalSerializer
     lookup_filed = 'slug'
     parser_classes = (JSONParser, MultiPartParser, FormParser)

当我使用 drf 网页界面时:

【问题讨论】:

    标签: django django-forms django-rest-framework image-uploading multipartform-data


    【解决方案1】:

    我通过覆盖 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 的 form-data 类型

    还要确保添加创建模型动物所需的所有字段

    不要添加 images 字段并使其在序列化程序中只读

    创建一个新字段并将其命名为 file 并使其类型为 File 而不是 Text。

    字段的名称必须是 file,因为您将使用 getlist('file')。名称必须相同。这让我搞砸了。

    【讨论】:

    • 这个答案,是通过 ForeignKey 与 Django REST Framework 的反向关系上传多个图像的最简单的解决方案。我花了一天时间寻找另一种方法。不要浪费你的时间,相信我。 KISS
    • 我找到了一种替代方案的解决方案,您可以使用表单数据上传多个图像,验证并发送嵌套的 json。你可以查看我的answer
    猜你喜欢
    • 2013-10-12
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2019-08-14
    相关资源
    最近更新 更多