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.

Reply via email to