2016-03-30 73 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

問題是,您正在對工作周進行加工......這會將該值轉換爲字符串「[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 

...但如果發生這種情況很快在這個過程中,我不記得以防止序列化器拒絕字符串。