Usar com FastAPI
PyODMongo é totalmente compatível com FastAPI devido à sua base Pydantic. Essa compatibilidade permite utilizar o PyODMongo em aplicações FastAPI de maneira elegante e eficiente, permitindo a criação de consultas dinâmicas em tempo de execução.
from fastapi import FastAPI, Request
from pyodmongo import DbModel, AsyncDbEngine
from pyodmongo.queries import mount_query_filter
from typing import ClassVar
app = FastAPI()
engine = AsyncDbEngine(mongo_uri="mongodb://localhost:27017", db_name="my_db")
class MyModel(DbModel):
attr1: str
attr2: str
attr3: int
_collection: ClassVar = "my_model"
@app.get("/", response_model=list[MyModel])
async def get_route(request: Request):
query, sort = mount_query_filter(
Model=MyModel,
items=request.query_params._dict,
initial_comparison_operators=[],
)
return await engine.find_many(Model=MyModel, query=query, sort=sort)
No exemplo acima, definimos uma rota FastAPI GET /
que aceita parâmetros de consulta. A função mount_query_filter
, projetada para uso com Request
do FastAPI, constrói dinamicamente uma consulta com base nos itens desses parâmetros.
A Função mount_query_filter
A função mount_query_filter
se adapta perfeitamente com o FastAPI. Ela constrói dinamicamente uma consulta com base nos itens do dicionário passado, tornando-a compatível com o atributo request.query_params._dict
, que contém as query strings da rota.
Parâmetros da função
Model: DbModel
: A model para a qual a query será construída.items: dict
: O dicionário que contém os items de consulta da query.initial_comparison_operators: list[ComparisonOperator]
: Uma lista inicial de operadores de comparação.
A função retorna uma consulta com o operador and
aplicado entre todos os itens do dicionário passado.
Exemplo de uso
Quando você aciona a seguinte rota com query strings: http://localhost:8000/?attr1_eq=value_1&attr2_in=%5B'value_2',%20'value_3'%5D&attr3_gte=10&_sort=%5B%5B'attr1',%201%5D,%20%5B'attr2',%20-1%5D%5D
, o request.query_params._dict
irá conter o seguinte dicionário:
{
"attr1_eq": "value_1",
"attr2_in": "['value_2', 'value_3']",
"attr3_gte": 10,
"_sort": "[['attr1', 1], ['attr2', -1]]",
}
Neste dicionário, as chaves devem ser nomes de atributos seguidos por um sublinhado e um operador válido (por exemplo, "attr1" + "_" + "eq"
). Os operadores válidos são: "eq", "gt", "gte", "in", "lt", "lte", "ne", "nin", "sort"
.
Ao utilizar a função mount_query_filter
em combinação com Request
do FastAPI, você pode habilitar recursos de consulta poderosos e dinâmicos em suas aplicações.