Django Rest框架用于多张图片上传

5
我在使用Django Rest Framework时遇到了多图上传的困难。我想要创建一个租赁表格,用户可以填写有关租赁信息,并同时上传多张图片(例如厨房、客厅、浴室等)以进行注册。一个租赁可以有多个图片,所以我用了带有ManyToMany关系的图片字段。然而,我无法将多个图片发送到服务器或API,只能存储一张图片。即使我更改了数据库设计并选择了ManyToManyField选项,单个图片也无法被存储。 settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')

Models.py

 class Gallery(models.Model):
        image = models.FileField(null=True,blank=True,upload_to='upload/')
        class Meta:
            verbose_name = _('Gallery')
            verbose_name_plural = _('Galleries')

class Rental(models.Model):  
        listingName =  models.CharField(_("Lisitng Name"), max_length=255, blank=False, null=True,
            help_text=_("Title of the rental space"))
        property = models.CharField(_("Property type"),max_length=10,null=True)
        room = models.PositiveIntegerField(_("No of Rooms"), blank=False, null=True,
            help_text=_("Number of bedrooms available"))
        price = models.PositiveIntegerField(blank=False,null=True)
        city =  models.CharField(_("City"), max_length=255, blank=False, null=True)
        image = models.ManyToManyField(Gallery)

Serializers.py

class GallerySerializer(serializers.ModelSerializer):
    class Meta:
        model = Gallery
        fields=('pk','image') 


class RentalSerializer(serializers.ModelSerializer):
    image = GallerySerializer(many=True)
    class Meta:
        model = Rental
        fields = ('pk','listingName','property','city','room','price','image')

    def create(self,validated_data):
        listingName=validated_data.get('listingName',None)
        property=validated_data.get('property',None)
        city=validated_data.get('city',None)
        room=validated_data.get('room',None)
        price=validated_data.get('price',None)
        image=validated_data.pop('image')
        return Rental.objects.create(listingName=listingName,property=property,city=city,
            room=room,price=price,image=image)

Views.py

class FileUploadView(APIView):
        parser_classes = (FileUploadParser, )

    def post(self, request, format=None):
        uploaded_file = request.FILES['file']
        print('up_file is',uploaded_file)
        with open('/media/upload/'+uploaded_file.name, 'wb+') as destination:
            for chunk in uploaded_file.chunks():
                print('chunk',chunk)
                destination.write(chunk)
                destination.close()
        return Response(uploaded_file.name, status.HTTP_201_CREATED)

class RentalList(generics.ListCreateAPIView):
    serializer_class = RentalSerializer
    queryset = Rental.objects.all()
    def get(self,request,format=None):
        rental = self.get_queryset()
        serializer_rental = RentalSerializer(rental,many=True)
        return Response(serializer_rental.data)

    @permission_classes((IsAdminUser, ))
    def post(self,request,format=None):
        user=request.user
        serializer_rental = RentalSerializer(data=request.data,context={'user':user})
        if serializer_rental.is_valid():
            serializer_rental.save()
            return Response(serializer_rental.data,status=status.HTTP_201_CREATED)
        return Response(serializer_rental.errors,status=status.HTTP_400_BAD_REQUEST)


class RentalDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset=Rental.objects.all()
    serializer_class = RentalSerializer

前端部分一次性发送多个图像
 onDrop(files) {
          console.log('Received files: ', files);
          this.setState({
              files: files
          });
           var image = new FormData(files);
           console.log('formdata image',image);
            var multiple_image = files;
            console.log('multiple_image',multiple_image);
            $.each(multiple_image,function(i,file){
              image.append('image_'+i,file);
            });
            console.log('images are',image);
           $.ajax({
            url:'http://localhost:8000/api/upload/',
            data:image,
            contentType:false,
            processData:false,
            type:'POST',
            mimeType: "multipart/form-data",
           });
        }

控制台上的请求有效负载显示了所有的图片。可能出了什么问题?我做错了什么吗?


请问您能否提供您的 urls.py 文件吗?这将有助于我们尝试重现此问题。谢谢。 - AdelaN
1个回答

0

我认为您在settings.py文件中可能会错过了MEDIA_URLMEDIA_ROOT。如果您错过或配置不正确,Django将根据您的操作系统(对于我来说,Django将文件放置在/home/username/中)将文件放置在项目之外的其他位置。请检查您的计算机中是否有任何此类文件夹。

如果您已经在settings.py中配置了MEDIA_URLMEDIA_ROOT,请更新问题。


我更新了我的问题,加入了media_url和medi_root配置。 - Tushant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接