Подтвердить что ты не робот

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 и т.д. Я попытался найти объекты ассоциации и т.д., Но мне сложно с ним работать.

Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 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. Таким образом, он загружает оба объекта в один запрос.