

def sort_models_topologically(models):
    'Sort models topologically so that parents will precede children.'
    models = set(models)
    seen = set()
    ordering = []

    def dfs(model):
        if ((model in models) and (model not in seen)):
            seen.add(model)
            for foreign_key in model._meta.reverse_rel.values():
                dfs(foreign_key.model_class)
            ordering.append(model)
    names = (lambda m: (m._meta.name, m._meta.db_table))
    for m in sorted(models, key=names, reverse=True):
        dfs(m)
    return list(reversed(ordering))

dataset/ETHPy150Open coleifer/peewee/peewee.py sort_models_topologically/original