Django 创建时在DRF中上载多部分图像
我想有一个模型,你可以上传到createpost多个图像 在api/animals上的DRF web视图中/在post表单中,我想添加多个图像,并创建带有附加图像的新动物 假设我有以下模型: 我有以下序列化程序: 我有以下rest视图: 当我使用drf web界面时: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
我通过重写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