AttributeError: type object 'BaseGeneric' has no attribute 'model'
Получаю ошибку:
AttributeError: type object 'BaseGeneric' has no attribute 'model'
При запуске функции:
async def show_roles(session: AsyncSession):
# Показать записи из таблицы Role
my_generic = BaseGeneric[Role] #передаю модель алхимии
roles = await my_generic.find_all(session, {})
for role in roles:
role_dict = role.to_dict() # Преобразование модели Role в словарь
return role_dict['name']
где Role - это модель алхимии, а BaseGeneric - универсальный класс с CRUD'ами.
Role:
class Role(Base):
'''Таблица Роли пользователей'''
name: Mapped[str_uniq] = mapped_column(String)
# Связь с пользователями
users: Mapped[list["User"]] = relationship(back_populates="role")
BaseGeneric
# Объявляем типовой параметр T с ограничением
T = TypeVar("T", bound=Union[RoleSchema, Role])
class BaseGeneric(Generic[T]):
model: T
@classmethod
async def find_all(cls, session: AsyncSession, filters: PyBaseModel | None):
# Найти все записи по фильтрам
if filters:
filter_dict = filters.model_dump(exclude_unset=True)
else:
filter_dict = {}
logger.info(f"Поиск всех записей {cls.model.__name__} по фильтрам: {filter_dict}")
try:
query = select(cls.model).filter_by(**filter_dict)
result = await session.execute(query)
records = result.scalars().all()
logger.info(f"Найдено {len(records)} записей.")
return records
except SQLAlchemyError as e:
logger.error(f"Ошибка при поиске всех записей по фильтрам {filter_dict}: {e}")
raise
Ошибка возникает в cls.model.__name__
. Как починить?
P.S. Ещё я создал что-то вроде прослойки
class RoleGeneric(BaseGeneric):
model = Role
и передаю ее:
roles = await RoleGeneric.find_all(session, {})
Тогда всё замечательно отрабатывает. Но я не понимаю почему прослойка работает, а прямая передача модели нет.
Полный трейс ошибки:
Traceback (most recent call last):
File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.10/runpy.py", line 86, in _run_code
exec(code, run_globals)
File "/content/drive/MyDrive/GitHub/PDM_mvp_service/test/main_test.py", line 36, in <module>
asyncio.run(main())
File "/usr/lib/python3.10/asyncio/runners.py", line 44, in run
return loop.run_until_complete(main)
File "/usr/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete
return future.result()
File "/content/drive/MyDrive/GitHub/PDM_mvp_service/test/main_test.py", line 32, in main
await show_roles(session)
File "/content/drive/MyDrive/GitHub/PDM_mvp_service/test/test_read.py", line 26, in show_roles
roles = await my_generic.find_all(session, {})
File "/content/drive/MyDrive/GitHub/PDM_mvp_service/Database/Services/generic.py", line 84, in find_all
print(cls.model.__name__)
AttributeError: type object 'BaseGeneric' has no attribute 'model'