将图像列表发送到Django REST框架 - iOS客户端

时间:2016-08-14 10:03:47

标签: ios django rest django-rest-framework alamofire

我正在尝试从 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]看到收到的第一张图片时。

这段代码可能出现什么问题?怎么解决?有没有更好的方法来实现这个?

1 个答案:

答案 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)