On Fri, Apr 20, 2012 at 9:28 PM, Michael Bayer <mike...@zzzcomputing.com> wrote: > > On Apr 20, 2012, at 8:45 AM, Eric Lemoine wrote: > >> On Mon, Apr 16, 2012 at 10:49 PM, Eric Lemoine >> <eric.lemo...@camptocamp.com> wrote: >>> Hi >>> >>> I'd like to use an associationproxy for a simple many-to-one relationship: >>> >>> class Child(Base): >>> __tablename__ = 'child' >>> id = Column(Integer, primary_key=True) >>> name = Column(Unicode) >>> >>> class Parent(Base): >>> __tablename__ = 'parent' >>> id = Column(Integer, primary_key=True) >>> child_id = Column(Integer, ForeignKey('child.id') >>> child_ = relationship(Child) >>> child = association_proxy('child_', 'name', creator=) >>> >>> Now 'child' is a read-only, dictionary-like table. I never want to insert >>> new rows in this table. >>> >>> So I actually pass the following "creator" to the association_proxy >>> constructor: >>> >>> def creator(name): >>> return Session.query(Child).filter_by(name=name).first() > >>> >>> That does the job for "create". But I cannot find a solution for "update". >>> On update I'd like to replace the current Child object in the Parent object >>> by a new Child object read from the 'child' table. >>> >>> Using a specific setter (in a getset_factory) does not work for me, as the >>> setter receives the Child object (and the value), not the Parent object – >>> I'd need a ref to the Parent object to be able to change its Child object in >>> child_. >>> >>> Maybe I'm doing it all wrong and using an associationproxy is not the way to >>> go for that case. > > the associationproxy is good for collections but in this case I'm not sure > what you're getting versus a regular @property or @hybrid_property.
Yeah I was wondering too. And I actually did not know about the existence of hybrid_property. > > I will note that I think I do a use case a little bit similar to this, where > Parent.children is a dictionary keyed on name. But instead of sticking > Session.query() into creator, I use a recipe similar to the unique object > recipe: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject . This is also very good to know (and study). > > If the associationproxy is doing it's job, modifying "Parent.child", as a > string, should be updating Parent._child.name with the new value. If you > wanted to replace that with "just swap this other Child in", you could do > that in a before_flush() event, not unlike the insert versions recipe: > http://www.sqlalchemy.org/trac/wiki/UsageRecipes/VersionedRows > > but just sticking with @property or hybrid might be more straightforward > here, if it works. Yeah. Thanks a lot Mike! This gives me interesting paths to research. -- Eric Lemoine Camptocamp France SAS Savoie Technolac, BP 352 73377 Le Bourget du Lac, Cedex Tel : 00 33 4 79 44 44 96 Mail : eric.lemo...@camptocamp.com http://www.camptocamp.com -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.