Атрибут relationships класса Mapper
Атрибут relationships класса Mapper возвращает
словарь всех связей, настроенных для отображаемого класса.
Ключами словаря выступают имена атрибутов-связей, а значениями -
объекты RelationshipProperty, описывающие параметры
каждой связи: целевую модель, внешний ключ, направление и
стратегию загрузки. Атрибут доступен через экземпляр
Mapper, который можно получить по классу модели.
Синтаксис
Mapper.relationships
Пример
Давайте создадим две связанные модели и посмотрим на словарь связей:
from sqlalchemy import 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]
articles: Mapped[list['Article']] = relationship(back_populates='user')
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
user_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
user: Mapped['User'] = relationship(back_populates='articles')
Теперь выведем имена всех связей модели Article:
from sqlalchemy import 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]
articles: Mapped[list['Article']] = relationship(back_populates='user')
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
user_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
user: Mapped['User'] = relationship(back_populates='articles')
print(list(Article.__mapper__.relationships.keys()))
Результат выполнения кода:
['user']
Пример
Давайте выведем имена связей модели User:
from sqlalchemy import 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]
articles: Mapped[list['Article']] = relationship(back_populates='user')
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
user_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
user: Mapped['User'] = relationship(back_populates='articles')
print(list(User.__mapper__.relationships.keys()))
Результат выполнения кода:
['articles']
Пример
Давайте обратимся к конкретной связи и посмотрим ее целевой класс:
from sqlalchemy import 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]
articles: Mapped[list['Article']] = relationship(back_populates='user')
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
user_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
user: Mapped['User'] = relationship(back_populates='articles')
rel = Article.__mapper__.relationships['user']
print(rel.mapper.class_)
print(rel.uselist)
Результат выполнения кода:
<class 'models.User'>
False
Свойство uselist равно False, потому что связь
user возвращает один объект, а не коллекцию.
Пример
Давайте переберем все связи модели и выведем их параметры:
from sqlalchemy import 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]
articles: Mapped[list['Article']] = relationship(back_populates='user')
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
user_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
user: Mapped['User'] = relationship(back_populates='articles')
for name, rel in User.__mapper__.relationships.items():
print(name, rel.mapper.class_.__name__, rel.uselist)
Результат выполнения кода:
"articles Article True"
Свойство uselist равно True, потому что связь
articles возвращает коллекцию объектов.
Смотрите также
-
класс
Mapper,
который хранит конфигурацию отображаемого класса -
атрибут
columns,
который содержит словарь колонок модели -
атрибут
attrs,
который содержит все атрибуты отображаемого класса -
метод
get_property,
который возвращает свойство по его имени