web-dev-qa-db-fra.com

sqlalchemy attributs de relation de clé étrangère

J'ai une table User et une table Friend. La table Friend contient deux clés étrangères à la fois à ma table User et à un champ d'état. J'essaie de pouvoir appeler des attributs de ma table User sur un objet Friend. Par exemple, j'aimerais pouvoir faire quelque chose comme, friend.name ou 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)

Lorsque j'obtiens friend objets, je n'ai que les 2 user_ids et je souhaite afficher toutes les propriétés de chaque utilisateur afin de pouvoir utiliser ces informations dans des formulaires, etc. Ceci est juste un extrait d'un plus grand projet Flask et cette fonctionnalité va être pour les requêtes friend, etc. J'ai essayé de rechercher des objets d'association, etc., mais J'ai du mal avec ça.

Toute aide serait grandement appréciée.

31
Ptrkcon

Tout d'abord, si vous utilisez flask-sqlalchemy, pourquoi utilisez-vous directement sqlalchemy au lieu du flacon db.Model?

Je recommande fortement d'utiliser flask-sqlalchemy extension car elle exploite les sessions et d'autres choses intéressantes.

La création d'un objet de commodité proxy est simple. Ajoutez simplement la relation avec lui dans la classe 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 s'occupe du reste et vous pouvez accéder à l'objet utilisateur simplement en:

name = friend.user.name

Si vous prévoyez d'utiliser l'objet user à chaque fois que vous utilisez l'objet friend, spécifiez lazy='joined' dans le relationship. De cette façon, il charge les deux objets dans une seule requête.

42
Paolo Casciello