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.
Huh. Bon point. Merci. – Leopd
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. –