I have an API which works when it is like this:
@router.put('/edit_teacher', status_code=200, response_model=TeacherDisplay)
async def edit_teacher(teacher_id: int, db: DB_DEPENDENCY, teacher_new_name: str | None = None, teacher_pic: UploadFile | None = None):
return await teacher_functions.edit_teacher(teacher_id=teacher_id, teacher_new_name=teacher_new_name, db=db, teacher_pic=teacher_pic)
but I want to get teacher_id and teacher_new_name in body but whatever I do I get 422 Unprocessable Entity Error
I searched a lot and it seems it has something to do with sending file next to those parameters but I have a similar API like this:
@router.post('/add_teacher', status_code=200, response_model=TeacherDisplay)
async def add_teacher(teacher_name: TEACHER_NAME_BODY, db: DB_DEPENDENCY, teacher_pic: UploadFile | None = None):
return await teacher_functions.add_teacher(teacher_name=teacher_name, db=db, teacher_pic=teacher_pic)
I don’t understand why this works fine but the other one doesn’t. the main problem is that I want to send teacher_id and teacher_new_name as body parameters and teacher_new_name should be optional.
I have tried many different ways. first I was writing it like this:
class EditTeacherModel(BaseModel):
id: int
teacher_new_name: str | None = None
@router.put('/edit_teacher', status_code=200, response_model=TeacherDisplay)
async def edit_teacher(request: EditTeacherModel, db: DB_DEPENDENCY, teacher_pic: UploadFile | None = None):
return await teacher_functions.edit_teacher(request=request, db=db, teacher_pic=teacher_pic)
even:
@router.put('/edit_teacher', status_code=200, response_model=TeacherDisplay)
async def edit_teacher(request: EditTeacherModel, db: DB_DEPENDENCY, teacher_pic: UploadFile | None = None):
teacher_id = request.id
teacher_new_name = request.teacher_new_name
return await teacher_functions.edit_teacher(teacher_id=teacher_id, teacher_new_name=teacher_new_name, db=db, teacher_pic=teacher_pic)
didn’t work.
Hossein is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.