Sto scrivendo una migrazione di dati in Sud per correggere alcuni dati denormalizzati che ho sbagliato nel codice precedente. Il modo per calcolare il valore corretto per il campo errato è chiamare un metodo statico sulla classe del modello django. Il codice è simile al seguente:Come chiamare un metodo statico su una classe di modello django durante una migrazione 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()
Ma questo non riesce con
AttributeError: type object 'Account' has no attribute 'lookup_by_name'
Sto indovinando sud solo non supporta @staticmethod
s per il modello classi?
Tentare di importare Account fallisce direttamente, a meno che non importi anche Record direttamente e ignori completamente l'oggetto ORM. È un'opzione sicura, dal momento che si tratta di una migrazione dei dati e lo schema non sta cambiando? O dovrei semplicemente eseguire questa correzione a mano piuttosto che nel contesto di una migrazione sud.
Huh. Buon punto Grazie. – Leopd
thx, sembra una buona ragione, ma a volte è davvero molto difficile non poterlo usare. Forse ci dovrebbero essere alcune impostazioni che possono cambiare comportamento, e lo sviluppatore è responsabile di mantenere il metodo lì nelle versioni successive del codice, se lui/lei lo accende. –