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
-Conor
Luckily, SQLAlchemy provides another query method, with_parent(), that
should work, and is a bit cleaner than my first approach:
q = session.query(Address)
q = q.with_parent(user, "addresses")
q = q.filter_by(id=address_id)
result = q.first()
or, as a generic function:
def get_related_by_id(obj, property_name, id):
relation = getattr(obj.__class__, property_name)
related_class = relation.property.argument
q = session.query(related_class)
q = q.with_parent(obj, property_name)
q = q.filter_by(id=id)
result = q.first()
Finally, SQLAlchemy has a (deprecated, unfortunately) Query classmethod
that makes it cleaner still:
def get_related_by_id(obj, property_name, id):
q = Query.query_from_parent(obj, property_name)
q = q.filter_by(id=id)
return q.first()
-Conor