2014-09-20 15 views
5

quando provo a correre manage.py makemigrations su Django 1.7, ottengo il seguente errore:Serializzare classmethods in Django 1.7

ValueError: Cannot serialize: <bound method ModelBase.get_default of <class 'printapp.models.JobConfiguration'>> 
There are some values Django cannot serialize into migration files. 
For more, see https://docs.djangoproject.com/en/dev/topics/migrations/#migration-serializing 

Quindi sembra che ci sia un problema con il metodo di get_default che è definito sulla JobConfiguration, la cui definizione è rammentano di seguito:

@classmethod 
def get_default(cls): 
    result = cls() 
    result.save() 
    return result 

Dopo la link that was provided in the error message, sembra che la serializzazione "riferimenti di classe" è una caratteristica supportata.

È un "riferimento di classe" uguale a @classmethod?

Come si inserisce un "riferimento di classe" nel "livello superiore del modulo"?

Perché i metodi devono essere monitorati dalle migrazioni? Ero sotto il presupposto che le migrazioni sono per gli schemi di database, che tracciano solo il tipo di dati memorizzati, non il tipo di metodi usati da una classe.

È interessante notare: modificare la definizione di get_default ad un metodo statico ripetuto sotto risolve il problema, ma a costo di dover codificare il JobConfiguration nomeclasse.

@staticmethod 
def get_default(): 
    result = JobConfiguration() 
    result.save() 
    return result 

(Alcuni contesto:. Questo metodo viene fatto riferimento come JobConfiguration.get_default dall'interno di una models.OneToOneField(JobConfiguration, default=JobConfiguration.get_default) con l'effetto di creare un nuovo JobConfiguration per ognuno di questi campi creati)

+1

Appena fuori interesse, cosa ti dà sopra 'JobConfiguration.objects.create()'? È ancora un comando, a malapena più digitato. –

+0

Huh, non avevo capito che il metodo era disponibile. Probabilmente lo cambierò nel mio codice, ma sono comunque interessato a sapere perché il codice non funziona così com'è. – Z1MM32M4N

risposta

0

Migrations are just Python files containing the old definitions of your models - thus, to write them, Django must take the current state of your models and serialize them out into a file.

classmethod è legano a la classe. Poiché il decoratore avvolge il metodo, il serializzatore affronta un'ambiguità su cosa legare: il wrapper o il methos, e fallisce. Con il metodo statico non esiste un problema di questo tipo perché è una funzione semplice associata alla classe.