> Some assumptions: > 1. "SA-mapped object" means the user object in the example > 2. "property name" means "addresses" in the example > 3. The function shouldn't assume that you want an Address object > 4. The ID attribute is known ahead of time (e.g. its always "id"). If > not, your function will need another parameter. > 5. The function needs to work on many-to-many relationships in addition > to one-to-many. > > Then this should work: > def get_related_by_id(obj, property_name, id): > relation = getattr(obj.__class__, property_name) # in example: > User.addresses > related_class = relation.property.argument # in example: Address > return Session.query(related_class).filter(relation.any(id=id)).first() > > example usage: > address_exists = get_related_by_id(user, "addresses", 1234) is not None
Cool, it almost solves my problem! However, it doesn't check if a User have a given Address, it just checks if an Address exists in general. It would be easy to add another filter() by User.id, but that wouldn't work for many-to-many relations. My hope was to somehow get a Query object from a relation property with everything already set up (imagining that a relation somewhere stores the query it itself uses) and then just attach another filter() to it. Imaginary code: relation = getattr(obj.__class__, property_name) q = relation.get_query(...) result = q.filter(id = address_id).first() This approach works in Django's ORM, so it definitely should be doable in SA :) --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---