Как задать отношения в sqlalchemy что бы свойство было доступной в обеих моделях?

Для задания отношений в 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, чтобы свойства были доступны в обеих моделях, в зависимости от необходимости использовать один-к-одному или один-ко-многим отношение.