From 910638e3a6db2a7a71a1d9fd6a093a6494b1e620 Mon Sep 17 00:00:00 2001 From: vikynoah Date: Thu, 3 Apr 2025 09:45:09 +0200 Subject: [PATCH] fix: get_object alter for async response filter (#44) --- creyPY/fastapi/crud.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/creyPY/fastapi/crud.py b/creyPY/fastapi/crud.py index ad03e89..57a8bff 100644 --- a/creyPY/fastapi/crud.py +++ b/creyPY/fastapi/crud.py @@ -50,16 +50,30 @@ def get_object_or_404( selected_columns = [ getattr(db_class, field) for field in response_fields if hasattr(db_class, field) ] - query = select(*selected_columns).select_from(db_class) + query = select(*selected_columns).where(getattr(db_class, lookup_column) == id) + result = await db.execute(query) + row = result.first() + + if row is None: + raise HTTPException(status_code=404, detail="The object does not exist.") + if hasattr(row, "_mapping"): + obj_dict = dict(row._mapping) + else: + obj_dict = {column.key: getattr(row, column.key) + for column in selected_columns} else: - query = select(db_class).filter(getattr(db_class, lookup_column) == id) - result = await db.execute(query) - obj = result.scalar_one_or_none() - if obj is None: - raise HTTPException(status_code=404, detail="The object does not exist.") # type: ignore + query = select(db_class).where(getattr(db_class, lookup_column) == id) + result = await db.execute(query) + row = result.scalar_one_or_none() + + if row is None: + raise HTTPException(status_code=404, detail="The object does not exist.") + + obj_dict = {k: v for k, v in row.__dict__.items() + if not k.startswith('_')} if expunge: - await db.expunge(obj) - return obj + await db.expunge(obj_dict) + return obj_dict def _get_sync_object() -> T: if response_fields: