2010-07-22 11 views
22

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.

risposta

36

Non è possibile utilizzare i metodi da models.py nelle migrazioni sud. Il motivo è che in futuro models.py si evolverà e prima o poi cancellerai quei metodi, quindi la migrazione verrà interrotta.

È necessario inserire tutto il codice necessario per la migrazione nel file di migrazione stesso.

+3

Huh. Buon punto Grazie. – Leopd

+0

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. –

1

Non si stanno utilizzando nomi diversi lookup_by_name e lookup_name?

+0

Grazie per la cattura l'errore di battitura nella mia interrogazione. Questo non è il problema con il mio vero codice. – Leopd

+0

Ho inviato una piccola richiesta di modifica per correggere questo errore nella domanda originale. Stavo dando un'occhiata a questa domanda perché ho avuto un problema simile e sono stato distratto dalla semplice risposta. –

Problemi correlati