Sqlalchemy атрибуты отношения внешнего ключа
У меня есть таблица User и таблица Friend. Таблица Друг содержит два внешних ключа как для моей таблицы User, так и для поля состояния. Я пытаюсь использовать атрибуты из таблицы User в объекте Friend. Например, я хотел бы иметь возможность делать что-то вроде friend.name или friend.email.
class User(Base):
""" Holds user info """
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String(25), unique=True)
email = Column(String(50), unique=True)
password = Column(String(25))
admin = Column(Boolean)
# relationships
friends = relationship('Friend', backref='Friend.friend_id',primaryjoin='User.id==Friend.user_id', lazy='dynamic')
class Friend(Base):
__tablename__ = 'friend'
user_id = Column(Integer, ForeignKey(User.id), primary_key=True)
friend_id = Column(Integer, ForeignKey(User.id), primary_key=True)
request_status = Column(Boolean)
Когда я получаю объекты friend
, все, что у меня есть, это 2 user_ids
, и я хочу отображать все свойства каждого пользователя, чтобы я мог использовать эту информацию в формах и т.д. Я новичок в sqlalchemy - все еще пытаюсь научиться более продвинутые функции. Это всего лишь фрагмент из более крупного проекта Flask, и эта функция будет для запросов friend
и т.д. Я попытался найти объекты ассоциации и т.д., Но мне сложно с ним работать.
Любая помощь будет принята с благодарностью.
Ответы
Ответ 1
Во-первых, если вы используете flask-sqlalchemy
, почему вы используете непосредственно sqlalchemy вместо Flask db.Model
?
Я настоятельно рекомендую использовать расширение flask-sqlalchemy
, поскольку оно использует сеансы и некоторые другие аккуратные вещи.
Создание объектного удобного объекта просто. Просто добавьте связь с ним в класс Friend
.
class Friend(Base):
__tablename__ = 'friend'
user_id = Column(Integer, ForeignKey(User.id), primary_key=True)
friend_id = Column(Integer, ForeignKey(User.id), primary_key=True)
request_status = Column(Boolean)
user = relationship('User', foreign_keys='Friend.user_id')
friend = relationship('User', foreign_keys='Friend.friend_id')
SQLAlchemy позаботится об остальном, и вы можете получить доступ к объекту пользователя, просто:
name = friend.user.name
Если вы планируете использовать объект user
каждый раз, когда вы используете объект Friend
, укажите lazy='joined'
в relationship
. Таким образом, он загружает оба объекта в один запрос.