Для задания отношений в SQLAlchemy, чтобы свойство было доступным в обеих моделях, можно воспользоваться двумя основными типами связей: один-к-одному (One-to-One) и один-ко-многим (One-to-Many).
1. Один-к-одному (One-to-One) отношение:
В случае, если у вас есть две модели, например, User и Profile, и вам необходимо, чтобы свойства были доступны в обеих моделях, вы можете использовать один-к-одному отношение.
from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) profile = relationship("Profile", uselist=False, back_populates="user") class Profile(Base): __tablename__ = 'profiles' id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey('users.id')) user = relationship("User", back_populates="profile")
В данном примере, связь User и Profile установлена через поле user_id в таблице Profile. В модели User используется relationship с параметром uselist=False, чтобы указать, что связь один-к-одному, а не один-ко-многим. Параметр back_populates указывает на обратную связь в модели Profile.
2. Один-ко-многим (One-to-Many) отношение:
В случае, если у вас есть две модели, например, User и Post, и вам необходимо, чтобы свойства были доступны в обеих моделях, вы можете использовать один-ко-многим отношение.
from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) posts = relationship("Post", back_populates="user") class Post(Base): __tablename__ = 'posts' id = Column(Integer, primary_key=True) title = Column(String) user_id = Column(Integer, ForeignKey('users.id')) user = relationship("User", back_populates="posts")
В данном примере, связь User и Post установлена через поле user_id в таблице Post. В модели User используется relationship с параметром back_populates, чтобы указать на обратную связь в модели Post.
Теперь вы можете обращаться к свойствам моделей из обоих сторон отношения. Например:
user = session.query(User).first() print(user.profile) # доступ к профилю пользователя
или
post = session.query(Post).first() print(post.user.name) # доступ к имени пользователя, создавшего пост
Таким образом, вы можете задать отношения в SQLAlchemy, чтобы свойства были доступны в обеих моделях, в зависимости от необходимости использовать один-к-одному или один-ко-многим отношение.