> 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
-~----------~----~----~----~------~----~------~--~---

Reply via email to