attributs de relation de clé étrangère sqlalchemy

J'ai une table Utilisateur et une table ami. La table ami contient deux clés étrangères à la fois à ma table utilisateur ainsi qu'un champ d'état. J'essaie de pouvoir appeler des attributs de ma table utilisateur sur un objet ami. Par exemple, j'aimerais pouvoir faire quelque chose comme, friend.name, ou ami.courriel.

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)

Quand je reçois friend objets de tout ce que j'ai est le 2 user_ids et je veux afficher toutes les propriétés de chaque utilisateur afin que je puisse utiliser ces informations dans les formulaires, etc. Je suis nouvelle sqlalchemy-toujours essayer d'apprendre des fonctionnalités plus avancées. Ceci est juste un extrait d'un projet Flask plus grand 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.

28
demandé sur Paolo Casciello 2013-09-15 03:15:28

1 réponses

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

Je recommande fortement d'utiliser flask-sqlalchemy extension car elle tire parti des sessions et d'autres choses soignées.

La création d'un objet de commodité proxy est simple. Ajoutez simplement la relation avec elle 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 par:

name = friend.user.name

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

35
répondu Paolo Casciello 2014-03-07 11:59:38