Skip to content

Instantly share code, notes, and snippets.

@Saakshaat
Created December 22, 2020 21:13
Show Gist options
  • Save Saakshaat/2623495998dc31f4ef1f06ac68e809f9 to your computer and use it in GitHub Desktop.
Save Saakshaat/2623495998dc31f4ef1f06ac68e809f9 to your computer and use it in GitHub Desktop.
Resolve Relationships with SQLAlchemy Inspect
from pydantic import BaseModel
from sqlalchemy import inspect
from models.base import Model
def get_all_relationships(model):
inspector = inspect(model)
return inspector.relationships
def create_relationship_model(data, relationship):
return relationship.mapper.class_(**getattr(data, relationship.key).dict())
def create_single_resource_with_dependents(model: Model, data: BaseModel, db):
relationships = get_all_relationships(model)
non_related_data = {}
for data_field, data_value in data.dict().items():
if any(relationship.key == data_field for relationship in
relationships): # current field in the input data is a relationship item
continue
non_related_data[data_field] = data_value
primary_resource = model(**non_related_data)
for relationship in relationships:
# relationship object not present
if relationship.key not in data.fields or getattr(data, relationship.key) is None:
setattr(primary_resource, relationship.key, [] if relationship.uselist else None)
continue
if relationship.uselist: # one-to-many or many-to-one relationship
relationship_list = getattr(primary_resource, relationship.key)
relationship_list.extend(
[create_relationship_model(single_data_element, relationship) for single_data_element in data])
setattr(primary_resource, relationship.key, relationship_list)
else:
setattr(primary_resource, relationship.key, create_relationship_model(data, relationship))
db.add(primary_resource)
db.commit()
db.refresh(primary_resource)
return primary_resource
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment