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'

Ответы (0 шт):