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

... но я не помню, если это произойдет достаточно скоро в процессе для предотвращения отказа сериализатора от строки.

Смежные вопросы