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

...但如果发生这种情况很快在这个过程中,我不记得以防止序列化器拒绝字符串。