2017-01-23 13 views
2

我試圖序列化來自表單的數組。該陣列是這樣的:如何序列化發佈到Django後端的數組

some_id: 12 
array1[]:1 
array1[]:2 
array2[]:5 
array2[]:6 

,或者因爲它到達request.POST

<QueryDict: { 
    'array1[]': ['1', '2'], 
    'array2[]': ['5', '6'], ... 

現在,我得到串行很簡單ID工作:some_id = serializers.IntegerField(),這是偉大的。我測試過它沒有數組,一切都按預期工作。

對於數組,我想我發現了這個串行領域:listfield
我嘗試以下實現:

array1 = serializers.ListField(
    child=serializers.IntegerField(min_value=1) 
) 

這看起來像手動說,它是如何工作的,但似乎只給我下錯誤:

TypeError at /api/myendpoint/ 'int' object is not iterable

我真的不知道我哪裏錯了,也許我在錯誤的軌道(真的不Django的傢伙:)),但我敢肯定,這是一個小錯誤。

所以,我怎麼能序列化發佈陣列(或者我應該稱之爲字典?)

完整的痕跡似乎並沒有被包含什麼奇怪的,但我已經把它提供on pastebin

的數據貼有此jQuery代碼:

var mydata = { 
    array1: [1,2], 
    array2: [5,6], 
    some_id: 12 
}; 

$.ajax({ 
    url: "http://domain.com//api/myendpoint/", 
    dataType: "json", 
    data: mydata, 
    method: "POST" 
}) 

我使用:

  • Django的1.10.2
  • djangorestframework 3.5.2
  • 的jquery 2.1.4
+0

你可以包括完整的追溯? [我剛剛嘗試過](http://pastebin.com/BquZZvmj),並且認爲它沒有從我的測試輸入中獲得正確的值,但我沒有得到錯誤 – Sayse

+0

@Sayse是的,我會添加它的職位! – Nanne

+0

@Sayse'>>> data = {'my_arr []':['1','2']}'? – Gocht

回答

2

長話短說:我已經添加到了我的javascript:

jQuery.ajaxSettings.traditional = true; 

,現在它就像你所期望的

短篇小說長:

的最大的問題是,一個'簡單'的職位並不像我想象的那麼簡單。從這個問題,這是什麼jQuery的是發帖:

some_id: 12 
array1[]:1 
array1[]:2 
array2[]:5 
array2[]:6 

這是從前端發送的對象,幷包含屬性稱爲array1array2預計在後端,但什麼是發送字面上array1[]array2[]。儘管Daniel van Flymen的解決方案可能會使用這些屬性,但我一直在考慮修復這些括號。

this rather old jquery topic我發現jQuery的增加,這些對於像phpruby語言,但我發現:Python不喜歡它

由於增加了jQuery.ajaxSettings.traditional = true;,頭現在這個樣子:

some_id: 12 
array1:1 
array1:2 
array2:5 
array2:6 

這就是序列化器可以理解的預期結果。

1

你的值不被髮送作爲一個數組。它們被作爲個人密鑰發送。

如果你的目的是將按鍵反序列化到一個數組,那麼你可以在你的串行覆蓋to_internal_value()方法:

class CustomSerializer(serializers.Serializer): 
    my_array = serializers.ListField(
     child=serializers.IntegerField(min_value=1) 
    ) 

    def to_internal_value(self, data): 
     my_array = [] 
     for key, value in data.items(): 
      if "array[]" in key: 
       my_array.append(value) 

     # Perform some validation on your array 
     for item in array: 
      if item > 10: 
       raise ValidationError(
        { 
         'my_array': "A number was higher than 10." 
        } 
       ) 

     # Return the validated values  
     return { 
      'my_array': my_array 
     } 

to_internal_value()方法負責反序列化的數據。希望這可以讓你指向正確的方向。 請務必查看to_internal_value()documentation的示例。

+0

這個樣子很好的解決我目前的問題,謝謝!核心問題似乎是,我從前端是一個奇怪的帖子,所以我希望能找到解決方案,因爲這似乎更接近。我會看看是否可以修復。 – Nanne

+0

沒有汗水@Nanne,如果有幫助,一定要標記爲正確。 –

相關問題