向Django REST framework-iOS客户端发送图像列表

向Django REST framework-iOS客户端发送图像列表,ios,django,rest,django-rest-framework,alamofire,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: "profileImageP

我正试图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)")
            }
        }
序列化程序.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)
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
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)
型号.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)
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
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客户端请求之后,图像只是一个空列表。当硬编码列表[0]以查看收到的第一张图片时,我得到的HTML是“索引超出范围”


此代码中可能存在什么问题?如何解决?有没有更好的方法来实现这一点?

文件可以通过

request.FILES
所以你必须改变

serializer = PredefinedServiceSerializer(data=request.POST)

但是如果您使用的DRF高于3.0,那么根据,正确的方法是使用数据属性

serializer = PredefinedServiceSerializer(data=request.data)

可通过以下方式访问文件:

request.FILES
所以你必须改变

serializer = PredefinedServiceSerializer(data=request.POST)

但是如果您使用的DRF高于3.0,那么根据,正确的方法是使用数据属性

serializer = PredefinedServiceSerializer(data=request.data)

感谢您的回答,但即使进行了上述更改,问题仍然存在。感谢您的回答,但即使进行了上述更改,问题仍然存在。