Skip to content

Instantly share code, notes, and snippets.

@Drvanon
Last active March 4, 2019 23:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Drvanon/de3ea2cbf5e8300c42c674163982f465 to your computer and use it in GitHub Desktop.
Save Drvanon/de3ea2cbf5e8300c42c674163982f465 to your computer and use it in GitHub Desktop.
Self referential many to many relationship with extended data, containing foreign key
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, ForeignKey, String
from sqlalchemy.orm import relationship, mapper, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.associationproxy import association_proxy
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String)
followers = association_proxy("leader_follower", "follower")
leaders = association_proxy("follower_leader", "leader")
def __init__(self, name):
self.username = name
def __repr__(self):
return f"<User {self.username}>"
class Movement(Base):
__tablename__ = 'movements'
id = Column(Integer, primary_key=True)
class Association(Base):
__tablename__ = 'assoc'
id = Column(Integer, primary_key=True)
leader_id = Column(Integer, ForeignKey('users.id'))
follower_id = Column(Integer, ForeignKey('users.id'))
movement_id = Column(Integer, ForeignKey('movements.id'))
movement = relationship(Movement)
leader = relationship(User, foreign_keys=[leader_id], backref="leader_follower")
follower = relationship(User, foreign_keys=[follower_id], backref="follower_leader")
def __init__(self, leader, follower, movement):
self.leader = leader
self.follower = follower
self.movement = movement
if __name__=='__main__':
user1 = User('Alice')
user2 = User('Bob')
movement = Movement()
a = Association(user1, user2, movement)
print(a.leader)
print(user1.followers)
print(user2.leaders)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment