2016-03-30 15 views
0

ファイルをポストしているので、$ httpとFormDataオブジェクトを使用する必要があります。私がストリング化した配列でインスタンスをポストすると、検証では整数をポストしていないと言います。FormDataを使用してdjango ArrayFieldに投稿/パッチを適用する

私のモデルは次のようになります。

class User(models.Model): 
    work_week = ArrayField(models.IntegerField(), default=[0,1,2,3,4], size=7) 

私のシリアライザは、次のようになります。

class UserSerializer(serializer.ModelSerializer): 
    work_week = serializers.ListField(
     child=serializers.IntegerField(min_value=0, max_value=6) 
    ) 

javascriptのポストは、この

let data = { 
    work_week = [1,2,3]; 
} 

let fd = new FormData(); 
for (let [key, val] of Object.entries(data)) { 
    if (key === 'work_week') { 
     val = JSON.stringify(val); 
    } 

    fd.append(key, val) 
} 

$http({ 
    url: full_url, 
    method: this.method, 
    data: fd, 
    transformRequest: angular.identity, 
    headers: {'Content-Type': undefined} 
    }) 

私は取得していますエラーメッセージのように見えます:

{work_week: ["A valid integer is required."]} 

答えて

0

問題は、work_weekをストリング化しているということです。これは、その値を適切な配列として残す代わりに、文字列「[1,2,3]」に変換します。しかし、RESTフレームワークは、シリアライザの文字列からリストへの変換を処理しません。最も簡単な方法は、シリアライザにto_internal_values()あなた自身を提供するために、おそらくです:もちろん

def to_internal_values(self, data): 
    if isinstance(data['work_week'], str): 
     data['work_week'] = json.loads(data['work_week']) 
    do_any_validation_here() 
    return data 

、これは単にリストフィールドでシリアライザのためである...あなたは残りのフィールドを処理するためにそれを適応させる必要があります。

def validate_work_week(self, value): 
    if isinstance(value, str): 
     value = json.loads(value) 
    do_any_validation_here(value) 
    return value 

...しかし、これはプロセスですぐに十分発生した場合、私は覚えていません:あなたはこのフィールドの検証をオーバーライドすることで、シリアライザの残りの部分に影響を与えることなく、単一のフィールドのために似たような操作を行うことができるかもしれませんシリアライザが文字列を拒否しないようにします。

関連する問題