Django-fr

Forum

#1 23-03-2017 16:52:31

fhebert
Membre
Inscription : 23-03-2017
Messages : 1

dumpdata et dependencies

Bonjour à tous,

Je cherche à exporter avec dumpdata mes modèles. J'ai déclaré les méthodes get_by_natural_key sur mes Custom Manager et natural_key sur mes modèles. Ainsi que les attributs natural_key.dependencies quand il le fallait. Ex. :

def natural_key(self):
    return (self.enseignant, self.ue)
natural_key.dependencies = ['baobab.enseignant', 'baobab.ue']

Ma commande dumpdata est :

python manage.py dumpdata --natural-foreign --natural-primary -v 3 --format yaml -o /tmp/all.yml --traceback -e baobab.Argumentaire -e baobab.UECompteRendu -e baobab.UEPlanning -e baobab.Rapatriement

Autrement dit j'utilise bien les natural keys et j'exclus certains modèles de l'export.

Je reçois une exception :

RuntimeError: Can't resolve dependencies for baobab.Argumentaire, baobab.EnseignantUE, baobab.MentionUE, baobab.PSLExtend, baobab.Rapatriement, baobab.UE, baobab.UEClassement, baobab.UECompterendu, baobab.UEPlanning, baobab.UERenseignements, baobab.UERenseignementsSiteWeb, baobab.UESuivi in serialized app list.

J'ai regardé le code assez complexe pour résoudre les dépendances avant l'export, c'est-à-dire exporter en premier les modèles avec une méthode natural_key et ceux référencés par un attribut natural_key.dependencies. C'est dans django.core.serializers.sort_dependencies (fichier django/core/serializers/__init__.py). Avec un sys.stdout.write j'ai sorti la liste model_dependencies qui associe à chaque modèle toutes les dépendances résolues. Et toutes les dépendances semblent être présentes. Voici une sortie de model_dependencies:

[(<class 'ue.baobab.models.PSLExtend'>, [<class 'ue.baobab.models.UE'>]), (<class 'ue.baobab.models.Langue'>, []), (<class 'ue.baobab.models.Rapatriement'>, [<class 'ue.baobab.models.Compte'>, <class 'ue.baobab.models.UE'>]), (<class 'ue.baobab.models.Compte'>, [<class 'django.contrib.auth.models.User'>, <class 'django.contrib.auth.models.User'>]), (<class 'ue.baobab.models.EcoleDoctorale'>, []), (<class 'ue.baobab.models.Argumentaire'>, [<class 'ue.baobab.models.UE'>]), (<class 'ue.baobab.models.Email'>, []), (<class 'ue.baobab.models.IntituleGeneral'>, []), (<class 'ue.baobab.models.UERenseignementsSiteWeb'>, [<class 'ue.baobab.models.UERenseignements'>, <class 'ue.baobab.models.SiteWeb'>, <class 'ue.baobab.models.UERenseignements'>, <class 'ue.baobab.models.SiteWeb'>]), (<class 'ue.baobab.models.SiteWeb'>, []), (<class 'ue.baobab.models.MentionUE'>, [<class 'ue.baobab.models.UE'>, <class 'ue.baobab.models.Mention'>, <class 'ue.baobab.models.UE'>, <class 'ue.baobab.models.Mention'>, <class 'ue.baobab.models.TypeUEMention'>]), (<class 'ue.baobab.models.EnseignantUE'>, [<class 'ue.baobab.models.Enseignant'>, <class 'ue.baobab.models.UE'>, <class 'ue.baobab.models.Enseignant'>, <class 'ue.baobab.models.UE'>, <class 'ue.baobab.models.IntituleGeneral'>, <class 'ue.baobab.models.Centre'>]), (<class 'ue.baobab.models.UECompterendu'>, [<class 'ue.baobab.models.UE'>]), (<class 'ue.baobab.models.UESuivi'>, [<class 'ue.baobab.models.UE'>, <class 'ue.baobab.models.UE'>, <class 'ue.baobab.models.Semestrialisation'>]), (<class 'ue.baobab.models.UEClassement'>, [<class 'ue.baobab.models.UE'>, <class 'ue.baobab.models.UE'>, <class 'ue.baobab.models.Domaine'>, <class 'ue.baobab.models.Centre'>]), (<class 'ue.baobab.models.UEPlanning'>, [<class 'ue.baobab.models.UE'>]), (<class 'ue.baobab.models.UERenseignements'>, [<class 'ue.baobab.models.UE'>, <class 'ue.baobab.models.UE'>, <class 'ue.baobab.models.SiteEHESS'>]), (<class 'ue.baobab.models.UE'>, [<class 'ue.baobab.models.OuvertureMaster'>, <class 'ue.baobab.models.TypeUE'>, <class 'ue.baobab.models.StatutFiche'>, <class 'ue.baobab.models.Compte'>, <class 'ue.baobab.models.PSLExtend'>, <class 'ue.baobab.models.Motcle'>, <class 'ue.baobab.models.AireCulturelle'>, <class 'ue.baobab.models.Langue'>]), (<class 'ue.baobab.models.AnneeUniversitaire'>, []), (<class 'ue.baobab.models.Enseignant'>, [<class 'ue.baobab.models.EcoleDoctorale'>, <class 'ue.baobab.models.Qualite'>]), (<class 'ue.baobab.models.Jour'>, []), (<class 'ue.baobab.models.Semestrialisation'>, []), (<class 'ue.baobab.models.Motcle'>, []), (<class 'ue.baobab.models.AireCulturelle'>, []), (<class 'ue.baobab.models.Centre'>, [<class 'ue.baobab.models.Email'>]), (<class 'ue.baobab.models.Domaine'>, []), (<class 'ue.baobab.models.Mention'>, [<class 'ue.baobab.models.SiteEHESS'>, <class 'ue.baobab.models.Email'>]), (<class 'ue.baobab.models.OuvertureMaster'>, []), (<class 'ue.baobab.models.TypeUE'>, []), (<class 'ue.baobab.models.Qualite'>, []), (<class 'ue.baobab.models.TypeUEMention'>, []), (<class 'ue.baobab.models.StatutFiche'>, []), (<class 'ue.baobab.models.SiteEHESS'>, [])][<class 'ue.baobab.models.SiteEHESS'>, <class 'ue.baobab.models.StatutFiche'>, <class 'ue.baobab.models.TypeUEMention'>, <class 'ue.baobab.models.Qualite'>, <class 'ue.baobab.models.TypeUE'>, <class 'ue.baobab.models.OuvertureMaster'>, <class 'ue.baobab.models.Domaine'>, <class 'ue.baobab.models.AireCulturelle'>, <class 'ue.baobab.models.Motcle'>, <class 'ue.baobab.models.Semestrialisation'>, <class 'ue.baobab.models.Jour'>, <class 'ue.baobab.models.AnneeUniversitaire'>, <class 'ue.baobab.models.SiteWeb'>, <class 'ue.baobab.models.IntituleGeneral'>, <class 'ue.baobab.models.Email'>, <class 'ue.baobab.models.EcoleDoctorale'>, <class 'ue.baobab.models.Compte'>, <class 'ue.baobab.models.Langue'>, <class 'ue.baobab.models.Enseignant'>, <class 'ue.baobab.models.Centre'>, <class 'ue.baobab.models.Mention'>]

Voici le code de filtrage des dépendances avec mon "debug" dans django.core.serializers.sort_dependencies, qui me donne une exception. J'ai un peu de mal à comprendre la logique.

import sys
    sys.stdout.write(str(model_dependencies))
    while model_dependencies:
        skipped = []
        changed = False
        while model_dependencies:
            model, deps = model_dependencies.pop()

            # If all of the models in the dependency list are either already
            # on the final model list, or not on the original serialization list,
            # then we've found another model with all it's dependencies satisfied.
            found = True
            for candidate in ((d not in models or d in model_list) for d in deps):
                if not candidate:
                    found = False
            if found:
                model_list.append(model)
                changed = True
            else:
                skipped.append((model, deps))
        if not changed:
            sys.stdout.write(str(model_list))
            raise RuntimeError("Can't resolve dependencies for %s in serialized app list." %
                ', '.join('%s.%s' % (model._meta.app_label, model._meta.object_name)
                for model, deps in sorted(skipped, key=lambda obj: obj[0].__name__))
            )
        model_dependencies = skipped

Une idée ?

Merci de votre aide par avance :-)

frédéric

Hors ligne

Pied de page des forums