Hello everybody,
I've been tearing my hairs out trying to figure out how to achieve the
following.
Base = declarative_base()
class Group(Base):
g_id = Column(Integer, primary_key=True)
events = relationship('Event', backref='group', lazy='dynamic')
class Event(Base):
e_id = Column(Integer, primary_key=True)
g_id = Column(Integer, ForeignKey('group.g_id'), nullable=False)
e_date = Column(Date, nullable=False)
Given above (simplified) model I can filter Group.events for single Group
instance:
group = ...
events = group.events.filter(Event.e_date=='2013-01-01').all()
The question is how do I load all groups that had events on given date *with
events property loaded with filtered Event objects*?
session.query(Group).join(Event).filter(Event.e_date=='2013-01-01')
simply loads all groups that had events on given date but events had to be
loaded on per-group object basis.
I know how to use custom query for relationship but that query and its bind
parameters must be defined at the time the property is created:
class Group(Base):
today_events = relationship('Event',
primaryjoin='and_(Group.g_id==Event.g_id,
Event.e_date==func.current_date())')
What I need is something like above relationship with ability to provide *
primaryjoin* bind parameters at run-time. And that propert could be a
read-only as far as I can load it in single query.
P.S. I'll try it like so now:
statement = session.query(Group, Event).filter(Event.e_date==...).subquery()
session.query(Group).from_statement(statement)
but that "smells" not so good and I'm not sure if that would even work.
- alex
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.