2016-08-14 34 views
0

我試着去的iOS應用發送圖像列表爲Django的REST後端。這是使用AlamoFire的iOS請求。發送圖像的列表,Django的REST框架 - 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客戶端請求後的空白列表。當硬編碼列表[0]看到收到的第一張圖片時,我得到的HTML是「索引超出範圍」。

這段代碼中可能存在什麼問題?如何解決它?有沒有更好的方法來實現這一點?

回答

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) 
+0

感謝您的回答,但問題仍然存在,即使是上述更改。 –