With declarative base, is it possible to use a relationship within a
column_property? Here's some sample code to illustrate what I want to
achieve:
from sqlalchemy.engine import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import column_property, relation, sessionmaker
from sqlalchemy.schema import Column, ForeignKey
from sqlalchemy.sql.expression import exists
from sqlalchemy.types import Boolean, Integer, String
Base = declarative_base()
class Player(Base):
__tablename__ = 'players'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
star = Column(Boolean, nullable=False, default=False)
team_id = Column(Integer, ForeignKey('teams.id'), nullable=False)
team = relation('Team', back_populates='players')
class Team(Base):
__tablename__ = 'teams'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
players = relation('Player', back_populates='team')
# This doesn't work
#has_star_player = column_property(players.any(star=True))
# This works
has_star_player = column_property(
exists().where(id == Player.team_id).where(Player.star ==
True))
# This also works
Team.__mapper__.add_property(
'has_star_player2',
column_property(Team.players.any(star=True)),
)
engine = create_engine('sqlite://', echo=True)
Base.metadata.create_all(engine)
sess = sessionmaker(engine)()
arsenal = Team(name='Arsenal')
sess.add(arsenal)
fabregas = Player(name='Fabregas', team=arsenal, star=True)
sess.add(fabregas)
barcelona = Team(name='Barcelona')
sess.add(barcelona)
query = sess.query(Team.name).filter(Team.has_star_player == True)
print query.all()
query = sess.query(Team.name).filter(Team.has_star_player2 == True)
print query.all()
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.