getattr() is the most direct way but you can also use mapper.all_orm_descriptors[property_name]
On Wed, Aug 12, 2020, at 11:49 AM, Mark Aquino wrote: > I was interested in creating a generic helper function to get the > instrumented list associated with a "RelationshipProperty" for a Model, > you can get the relationship from > inspect(model).mapper.relationships.items(), but the relationship is just the > RelationshipProperty object and *not* the InstrumentedList. I could not see > a way to get the instrumented list from the relationship and was wondering if > I was missing something or if we really must use getattr(model, > property_name) to get the InstrumentedList. > > I also noticed that I couldn't directly set the instrumented list values from > the relationship; I can do add/remove/extend operations on the list but not > e.g. `relationship = [item1, item2, item3,]`, for that I had to use > setattr(model, relationship_name, values_array) > > Any feedback on my approach or if there is a better way to do this would be > appreciated! > > def type_query(type, id): > type_query = g.session.query(type).filter_by(id=id).one() > return type_query > > def get_relationship_from_model(parent_entity, relationship_model): > relationship_label = None > for label, r in inspect(parent_entity).mapper.relationships.items(): > if r.entity.class_ == relationship_model: > relationship_label = label > break > relationship = getattr(parent_entity, relationship_label) > return relationship_label, relationship > > > def update_list(relationship_model, entity_model, operation: str, id_list: > Optional[List[UUID]] = None): > """ > id list = ids to add or remove from relationship > relationship_type = the `type` of the relationship on entity model, e.g... > entity_model = the model whose relationships are being updated > operation = add or remove > :param id_list: > :param relationship_model: > :param entity_model: > :param operation: > :return: > """ > if not id_list: > return entity_model > # e.g. CvMeasurementAttribute -> cv_measurement_attributes > relationship_label, relationship = > get_relationship_from_model(parent_entity=entity_model, > > relationship_model=relationship_model) > entities_to_relate = [ > type_query(type=relationship_model, id=id_) for id_ in id_list > ] > if operation == "add": > relationship.extend(entities_to_relate) > elif operation == "remove": > for entity in entities_to_relate: > relationship.remove(entity) > else: > setattr(entity_model, relationship_label, entities_to_relate) > return entity_model > > > > -- > SQLAlchemy - > The Python SQL Toolkit and Object Relational Mapper > > http://www.sqlalchemy.org/ > > To post example code, please provide an MCVE: Minimal, Complete, and > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > description. > --- > 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 sqlalchemy+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sqlalchemy/323bfe66-3d7d-4fe1-87cf-feb4ca9566bfo%40googlegroups.com > > <https://groups.google.com/d/msgid/sqlalchemy/323bfe66-3d7d-4fe1-87cf-feb4ca9566bfo%40googlegroups.com?utm_medium=email&utm_source=footer>. -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- 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 sqlalchemy+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/dd4295cb-5c31-425f-b1b4-01e69f38c969%40www.fastmail.com.