2015-08-19 1 views
2

Voici mon modèle.Comment accéder à la variable de niveau classe du modèle dans la migration de données?

Poll(models.Model): 
    title = models.CharField(max_length=1024) 
    MY_VAR = ['my_class_level_attribute'] # I want to access this 

Voici mes données migration:

def my_func(apps, schema_editor): 
    Poll = apps.get_model('my_app', 'Poll') 
    print Poll.MY_VAR 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('webmerge', '0012_previous_migration'), 
    ] 

    operations = [ 
     migrations.RunPython(my_func) 
    ] 

La ligne print Poll.MY_VAR donne une erreur d'attribut. Je pense que la question pourrait est comment get_model effectue dans une migration de données, car les lignes suivantes succèdent dans une coquille Django:

In [2]: from django.apps import apps 
In [3]: Poll = apps.get_model('my_app', 'Poll') 
In [4]: Poll.MY_VAR 
Out[4]: ['my_class_level_attribute'] 

Répondre

1

Vous devriez pouvoir importer le modèle

from my_app.models import Poll 

Si vous faites cela , vous ne devez pas supprimer le modèle Poll ou l'attribut MY_VAR, sinon vos migrations cesseront de fonctionner.

+0

Dommage que cela semble être la seule solution possible. Quelqu'un en at-il un qui ne nécessite pas de coder ces choses dans les migrations, les rendant plus fragiles? –

+0

Eh bien, l'alternative est de copier les données directement dans la migration, ce qui est moins fragile, mais moins sec. Pour obtenir les deux, vous devez mettre à jour votre code, si je ne me trompe pas. Prenez un instantané de votre modèle actuel, stockez-le dans un répertoire instantané, dont le contenu est immuable ou ajoutez uniquement et importez le modèle à partir de là. Ou vous pouvez intégrer votre versioning, enregistrer le git shaw du commit actuel dans la migration et la migration, extraire le fichier correspondant de ce commit ... alors vous pourriez rencontrer des dépendances obsolètes, etc. Ce n'est vraiment pas un problème facile. – DylanYoung