我在使用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