Skip to content

graph

django_spire.contrib.sync.django.graph

build_graph

Source code in django_spire/contrib/sync/django/graph.py
def build_graph(models: list[type[SyncableMixin]]) -> DependencyGraph:
    labels = {model._meta.label for model in models}

    edges: dict[str, set[str]] = {}

    for model in models:
        dependencies: set[str] = set()

        foreign_keys = chain(
            model._meta.concrete_fields,
            model._meta.many_to_many,
        )

        for field in foreign_keys:
            if not field.is_relation:
                continue

            related_label = field.related_model._meta.label

            if related_label in labels and related_label != model._meta.label:
                if not getattr(field, 'null', True):
                    dependencies.add(related_label)

        edges[model._meta.label] = dependencies

    return DependencyGraph(edges)