2010-07-22 4 views
22

J'écris une migration de données dans le sud pour corriger certaines données dénormalisées que j'ai vissées dans du code précédent. Le moyen de déterminer la bonne valeur pour le champ incorrect consiste à appeler une méthode statique sur la classe de modèle django. Le code ressemble à ceci:Comment appeler une méthode statique sur une classe de modèle django lors d'une migration vers le sud

class Account(models.Model): 
    name = models.CharField() 

    @staticmethod 
    def lookup_by_name(name): 
     # There's actually more to it than this 
     return Account.objects.get(name=name) 

class Record(models.Model): 
    account_name = models.CharField() 
    acct = models.ForeignKey('Account') 

...

class Migration(DataMigration): 

    def forwards(self, orm): 
     # Fixing Records with the wrong FK to Account 
     for record in orm.Record.objects.all(): 
      record.acct = orm.Account.lookup_by_name(record.account_name) 
      record.save() 

Mais cela ne fonctionne pas avec

AttributeError: type object 'Account' has no attribute 'lookup_by_name'

Je devine que le sud ne vient supporte pas @staticmethod s sur le modèle Des classes?

Si vous tentez d'importer le compte, cela échoue directement, sauf si j'importe aussi Enregistrer directement et ignorez complètement l'objet ORM. Est-ce une option sûre, puisqu'il s'agit d'une migration de données et que le schéma ne change pas? Ou devrais-je simplement exécuter cette correction à la main plutôt que dans le contexte d'une migration vers le sud.

Répondre

36

Vous ne pouvez pas utiliser les méthodes issues de models.py dans les migrations vers le sud. La raison en est que dans le futur, models.py évoluera et que tôt ou tard vous supprimerez ces méthodes, la migration sera interrompue.

Vous devez placer tout le code requis par migration dans le fichier de migration lui-même.

+3

Huh. Bon point. Merci. – Leopd

+0

thx, Cela semble être une bonne raison, mais parfois c'est très pénible de ne pas pouvoir l'utiliser. Peut-être qu'il devrait y avoir des paramètres qui peuvent changer de comportement, et le développeur est responsable de conserver la méthode dans les versions ultérieures du code, s'il l'allume. –

1

N'utilisez-vous pas des noms différents lookup_by_name et lookup_name?

+0

Merci pour attraper la faute de frappe dans ma question. Ce n'est pas le problème avec mon vrai code. – Leopd

+0

J'ai soumis une petite demande de modification pour corriger cette erreur dans la question originale. Je passais en revue cette question parce que j'avais un problème semblable et a été distrait par la réponse simple. –

Questions connexes