我正在尝试从 iOS应用程序 发送图片列表到 Django REST 后端。这是使用AlamoFire的iOS请求。
iOS代码:
let URL = "myURL"
var imagesDictonaryList = [[String : AnyObject]]()
var images = [UIImage]()
for _ in 1...3 {
images.append(UIImage(named: "profileImagePlaceholder")!)
}
//let imagesData = imagesToBase64(images)
for index in 0..<3 {
var myDictionary = [String:AnyObject]()
myDictionary["name"] = "\(index)"
myDictionary["image"] = images[index]
imagesDictonaryList.append(myDictionary)
}
print(imagesDictonaryList)
let parameters = [
"title": "service 1 title",
"description": "service 1 description",
"price": "11",
"images": imagesDictonaryList
]
Alamofire.request(.POST, URL, parameters: parameters as? [String : AnyObject]).responseJSON { response in
print(response.request) // original URL request
print(response.response) // URL response
print(response.data) // server data
print(response.result) // result of response serialization
if let dataString = String(data: response.data!, encoding: NSUTF8StringEncoding) {
print(dataString)
}
if let JSON = response.result.value {
print("JSON: \(JSON)")
}
}
服务器代码:
views.py
class PredefinedServiceList(APIView):
"""
List all Predefined Services, or create a new Predefined Service
"""
permission_classes = (permissions.AllowAny,)
def post(self, request):
serializer = PredefinedServiceSerializer(data=request.POST)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
serializers.py
class ServiceImageSerializer(serializers.ModelSerializer):
def create(self, validated_data):
b64_text = validated_data.get('image', None)
image_data = b64decode(b64_text)
image_content = ContentFile(b"%s" % image_data, 'whatup.jpg')
validated_data['image'] = image_content
instance = ServiceImage.objects.create()
instance.save()
return instance
class Meta:
model = ServiceImage
fields = ('image', 'name')
class PredefinedServiceSerializer(serializers.ModelSerializer):
images = ServiceImageSerializer(many=True)
class Meta:
model = PredefinedService
fields = ('title', 'description', 'price', 'images')
def create(self, validated_data):
images_data = validated_data.pop('images')
service = PredefinedService.objects.create(**validated_data)
for image in images_data:
new_image, created = ServiceImage.objects.get_or_create(name=image.get('name', None))
new_image.image = image.get('image', None)
new_image.save()
service.images.add(new_image)
return service
models.py
class ServiceImage(models.Model):
image = models.ImageField(upload_to="predefined", null=True)
name = models.CharField(max_length=9001, null=True)
class PredefinedService(models.Model):
title = models.CharField(max_length=100, null=True, blank=True, default="untitled")
description = models.TextField(default="No description available.")
price = models.FloatField(default=0.000)
images = models.ForeignKey(ServiceImage, null=True, blank=True)
问题是图像不在代码中的request.data中,但发送的所有其他信息都在那里。
iOS客户端请求后,图片只是一个空列表。我得到的HTML是&#34;索引超出范围&#34;当硬编码列表[0]看到收到的第一张图片时。
这段代码可能出现什么问题?怎么解决?有没有更好的方法来实现这个?
答案 0 :(得分:0)
可以通过
访问文件request.FILES
所以你必须改变
serializer = PredefinedServiceSerializer(data=request.POST)
到
serializer = PredefinedServiceSerializer(data=request.POST, files=request.FILES)
但如果您使用的DRF高于3.0,那么根据docs,正确的方法是使用数据属性
serializer = PredefinedServiceSerializer(data=request.data)