sqlalchemy外键关系属性

Ptr*_*con 32 python sqlalchemy flask-sqlalchemy

我有一个User表和一个Friend表.Friend表包含两个外键,包括我的User表和状态字段.我试图能够在Friend对象上调用我的User表中的属性.例如,我希望能够做一些像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)
Run Code Online (Sandbox Code Playgroud)

当我获得friend对象时我只有2 user_ids并且我希望显示每个用户的所有属性,以便我可以在表单等中使用该信息.我是sqlalchemy的新手 - 仍在尝试学习更多高级功能.这只是一个较大的Flask项目的片段,这个功能将用于friend请求等.我试图查找关联对象等,但我很难用它.

任何帮助将不胜感激.

Pao*_*llo 44

首先,如果您正在使用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')
Run Code Online (Sandbox Code Playgroud)

SQLAlchemy将负责其余的工作,您只需通过以下方式访问用户对象:

name = friend.user.name
Run Code Online (Sandbox Code Playgroud)

如果你打算使用user对象每次使用的时间friend对象指定 lazy='joined'relationship.这样它就可以在单个查询中加载两个对象.

  • 这是令人困惑的:为什么您需要 Friend 上的关系?User 上的朋友的 backref 不应该照顾它吗?感觉像复制 (2认同)