Метод iterate_properties
Метод iterate_properties класса Mapper возвращает итератор,
который последовательно обходит все свойства маппера. Под свойствами
понимаются колонки таблицы, отношения между моделями и другие
атрибуты, привязанные к классу. Метод не принимает параметров
и возвращает объект-итератор, элементы которого являются экземплярами
ColumnProperty, RelationshipProperty и других классов свойств.
Синтаксис
Mapper.iterate_properties
Пример
Давайте создадим модель и получим список имен всех свойств маппера:
from sqlalchemy import create_engine, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
text: Mapped[str] = mapped_column(String(500))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
mapper = Article.__mapper__
for prop in mapper.iterate_properties:
print(prop.key)
Результат выполнения кода:
"id"
"title"
"text"
Пример
Давайте выведем не только имена, но и типы свойств маппера:
from sqlalchemy import create_engine, String, ForeignKey
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(100))
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
user_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
user: Mapped[User] = relationship()
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
mapper = Article.__mapper__
for prop in mapper.iterate_properties:
print(prop.key, type(prop).__name__)
Результат выполнения кода:
"id ColumnProperty"
"title ColumnProperty"
"user_id ColumnProperty"
"user RelationshipProperty"
Пример
Давайте отфильтруем только отношения и выведем их целевые классы:
from sqlalchemy import create_engine, String, ForeignKey
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
from sqlalchemy.orm.properties import RelationshipProperty
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(100))
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
user_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
user: Mapped[User] = relationship()
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
mapper = Article.__mapper__
for prop in mapper.iterate_properties:
if isinstance(prop, RelationshipProperty):
print(prop.key, '->', prop.mapper.class_.__name__)
Результат выполнения кода:
"user -> User"
Смотрите также
-
класс
Mapper,
который управляет отображением класса на таблицу -
метод
get_property,
который возвращает свойство по его имени -
атрибут
columns,
который хранит коллекцию колонок маппера -
атрибут
relationships,
который хранит коллекцию отношений маппера