Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sqlalchemy foreign key relationship attributes

I have a User table and a Friend table. The Friend table holds two foreign keys both to my User table as well as a status field. I am trying to be able to call attributes from my User table on a Friend object. For example, I would love to be able to do something like, friend.name, or 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) 

When I get friend objects all I have is the 2 user_ids and i want to display all properties of each user so I can use that information in forms, etc. I am new to sqlalchemy - still trying to learn more advanced features. This is just a snippet from a larger Flask project and this feature is going to be for friend requests, etc. I've tried to look up association objects, etc, but I am having a hard with it.

Any help would be greatly appreciated.

like image 494
Ptrkcon Avatar asked Sep 14 '13 23:09

Ptrkcon


People also ask

What is foreign key in SQLAlchemy?

user - there are multiple foreign key paths linking the tables. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference to the parent table.

How does SQLAlchemy define foreign key in flask?

First you need to supply a Primary Key for each model. Then you need to define one Foreign Key which refers to the Primary Key of the other model. Now you can define a relationship with a backref that allows direct access to the related model. In this case, the following 2 lines should look like this: request_id = db.


1 Answers

First, if you're using flask-sqlalchemy, why are you using directly sqlalchemy instead of the Flask's db.Model?

I strongly reccomend to use flask-sqlalchemy extension since it leverages the sessions and some other neat things.

Creating a proxy convenience object is straightforward. Just add the relationship with it in the Friend class.

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 will take care of the rest and you can access the user object simply by:

name = friend.user.name 

If you plan to use the user object every time you use the friend object specify lazy='joined' in the relationship. This way it loads both object in a single query.

like image 130
Paolo Casciello Avatar answered Sep 23 '22 10:09

Paolo Casciello