como solía hacer con las rutas FastApi, quiero hacer una función que espera un dict. Quiero escribir una sugerencia como en FastAPI con un modelo pydantic.
Tenga en cuenta que solo estoy usando FastAPI como referencia aquí y esta aplicación tiene un propósito totalmente diferente.
Lo que hice:
models.py
from pydantic import BaseModel class Mymodel(BaseModel): name:str age:int main.py
def myfunc(m:Mymodel): print(m) print(m.name) myfunc({"name":"abcd","age":3}) Imprime m como un dictado normal y not Mymodel y m.name simplemente arroja un AttributeError . No entiendo por qué se comporta así porque el mismo código funcionaría en FastAPI. ¿Me estoy perdiendo de algo? ¿Qué debo hacer para que esto funcione?
Estoy esperando un argumento dict en la función, quiero escribir una sugerencia con una clase heredada de pydantic BaseModel. Entonces quiero acceder a los atributos de esa clase.
no quiero hacer:
def myfunc(m): m = Mymodel(**m)Gracias.
Dado que pasa un dict a la función, se debe acceder al atributo de la siguiente manera:
print(m['name']) De lo contrario, para usar m.name en su lugar, debe convertir el dict al modelo Pydantic correspondiente antes de pasarlo a la función, como se muestra a continuación:
data = {"name":"abcd", "age":3} myfunc(Mymodel(**data)) # or myfunc(Mymodel.parse_obj(data)) La razón por la que funciona pasar {"name":"abcd", "age":3} en FastAPI y luego acceder a los atributos usando el operador de punto (por ejemplo, m.name ), es que FastAPI hace la conversión anterior internamente, tan pronto como llega una solicitud. Es por eso que puede volver a convertirlo en un diccionario en su punto final, usando m.dict() . Intente, por ejemplo, pasar una key incorrecta, por ejemplo, data = {"name":"abcd","myage":3} myfunc(Mymodel(**data)) . Obtendría un error de field required (type=value_error.missing) (como parte del manejo de errores de Pydantic), similar a lo que devolvería FastAPI (como se muestra a continuación) si una solicitud similar intentara pasar (puede probar eso a través de OpenAPI en http://127.0.0.1:8000/docs ). De lo contrario, cualquier diccionario pasado por el usuario (en la forma en que se muestra en la pregunta) pasaría sin arrojar un error, en caso de que no coincidiera con el modelo de Pydantic.
{ "detail": [ { "loc": [ "body", "age" ], "msg": "field required", "type": "value_error.missing" } ] }