2017-01-23 5 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の男:))上だけど、私はそれは小さなミスだと確信しています。

は、どのように私が投稿され、配列をシリアライズすることができます(または私はDictのそれを呼び出す必要がありますか?)

完全なトレースは奇妙な何かを含むしていないようですが、私は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" 
}) 

私が使用している:

  • ジャンゴ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; 

、あなたが長い

ショートストーリー期待するようになりました、それは動作します:

私が思ったほどシンプルではないというのが最大の問題でした。

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

をフロントエンドから送信された、およびバックエンドで期待されたオブジェクトがarray1array2と呼ばれるが、何送ったことは、文字通りarray1[]array2[]たプロパティが含まれて:質問から、これはjQueryの投稿されたものでした。ダニエル・バン・フライメンのソリューションがこれらのプロパティを使用するのにはおそらく動作しますが、これらの括弧を修正することを検討しています。 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()方法は、データをデシリアライズする責任があります。うまくいけば、これはあなたを正しい方向に向けるでしょう。 documentationの例をto_internal_value()にチェックアウトしてください。

+0

このルックス私の現在の問題を修正するために良い、ありがとう!コアの問題は、フロントエンドからの奇妙な投稿だと思われるので、解決策が見つかるはずです。それが修正できるかどうかがわかります。 – Nanne

+0

いいえ、汗@Nanne、それが助けられた場合は、正しいとマークするようにしてください。 –

関連する問題