FastAPI обнаруживает, что мой массив объектов JSON является недопустимым списком

Я использую FastAPI и пытаюсь отправить массив JSON объектов JSON в конечную точку сообщения в теле. Моя конечная точка определяется как:

@router.post("/create_mails")
def create_mails(notas: List[schemas.Nota], db: Session = Depends(get_db)):

Мое тело в Почтальоне выглядит так:

{
    "notas": [{"a":"1","b":"2","c":"3","d":"4"},
              {"a":"1","b":"2","c":"3","d":"4"}]
}

Однако я продолжаю получать ошибку 422 необработанного объекта от FastAPI с подробным описанием ошибки:
значение не является допустимым списком

Я также протестировал его с измененной конечной точкой:

@router.post("/create_mails")
def create_mails(notas: List[str] = Body([]), db: Session = Depends(get_db)):

и с простым строковым массивом, но возвращается та же ошибка.

Мне не хватает определения действительного списка FastAPI?


person Simon    schedule 07.09.2020    source источник


Ответы (1)


Я почти уверен, что ваш параметр метода POST должен моделировать все тело запроса, которое действительно является одним объектом, а не списком.
Чтобы соответствовать телу, которое вы пытаетесь отправить, вам понадобится что-то вроде :

class NotaList(BaseModel):
    notas: List[Nota]

а потом:

def create_mails(notas: schemas.NotaList) 
person tzaman    schedule 07.09.2020
comment
Я пробовал это с классом: class NotaList(BaseModel): list: List[schemas.Nota] и тестировал с данными: { "notas": {"list": [{"a":"1","b":"2","c":"3","d":"4"}, {"a":"1","b":"2","c":"3","d":"4"}]} } Но я получаю сообщение об ошибке: {"detail":[{"loc":["body","list"],"msg":"field required","type":"value_error.missing"}]} - person Simon; 08.09.2020
comment
@Simon, если ваш NotaList атрибут класса называется list, тогда переменная post также должна быть "list - почему вы оборачиваете ее дополнительным "notas"? - person tzaman; 08.09.2020
comment
Ах, спасибо, это была моя ошибка! Я подумал, что это должно быть в дополнительных примечаниях, потому что мой параметр метода был вызван таким образом. Но хитрость в использовании только списка! - person Simon; 08.09.2020
comment
Имя параметра вашего метода имеет отношение только к вашему собственному коду и представляет собой безымянный словарь верхнего уровня в POST. - person tzaman; 08.09.2020