Created
December 22, 2020 21:13
-
-
Save Saakshaat/2623495998dc31f4ef1f06ac68e809f9 to your computer and use it in GitHub Desktop.
Resolve Relationships with SQLAlchemy Inspect
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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