2014-09-03 15 views
15

Sto provando ad aggiornare un'applicazione django da django 1.6.6 a 1.7 e sto usando python 2.7.8. Quando eseguo python manage.py makemigrations, ottengo il seguente errore:Aggiornamento a Django 1.7. Errore: impossibile serializzare: <storages.backends.s3boto.S3BotoStorage object

ValueError: Cannot serialize: <storages.backends.s3boto.S3BotoStorage object at 0x11116eed0> 
There are some values Django cannot serialize into migration files. 

E qui è il codice rilevante:

protected_storage = storages.backends.s3boto.S3BotoStorage(
     acl='private', 
     querystring_auth=True, 
     querystring_expire=3600, 
    ) 


    class Document(models.Model): 
     ... 
     file = models.FileField(upload_to='media/docs/', max_length=10000, storage=protected_storage) 

     def __unicode__(self): 
      return "%s" % self.candidate 

     def get_absolute_url(self): 
      return reverse('documents', args=[str(self.pk)]) 

Ho letto la documentazione di migrazione e leggere su un problema analogo here, ma io' non sono stato in grado di risolvere questo La mia app utilizza django-storages e boto per salvare i file su Amazon S3. Qualsiasi aiuto è apprezzato.

risposta

26

Basta creare una sottoclasse decostruttibile e usarla al suo posto.

from django.utils.deconstruct import deconstructible 


@deconstructible 
class MyS3BotoStorage(S3BotoStorage): 
    pass 
+3

'da django.utils.deconstruct import deconstructible' – Druska

6

Il problema di base qui è che si sta tentando di utilizzare Django 1.7 con un pacchetto (django-storages) che non sembra essere stato aggiornato per funzionare ancora con quella versione.

Ecco alcuni estratti del documentation per spiegare ciò che sta accadendo:

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.

While Django can serialize most things, there are some things that we just can’t serialize out into a valid Python representation - there’s no Python standard for how a value can be turned back into code.

You can let Django serialize your own custom class instances by giving the class a deconstruct() method.

Quindi la soluzione è quella di dare un metodo deconstruct() classe storages.backends.s3boto.S3BotoStorage. Probabilmente sarà facile come applicare il decoratore di classe @deconstructible.

Presumibilmente, il pacchetto includerà questo cambiamento in qualche punto (o forse il ramo principale lo ha già?), Ma è anche possibile correggerlo da soli.

+0

'' '@deconstructible classe MyS3BotoStorage (S3BotoStorage): pass''' –

+0

Il commento su django-depositi fissato per me. Ho aggiornato e mi sono occupato delle cose. Nella mia circostanza, usando @deconstructible no. – Guerry

+0

Per il metodo personalizzato ** deconstruct() ** - consultare http://stackoverflow.com/questions/31953802/upgrading-from-django-1-6-to-1-7-getting-callable-is-not- serialize-when-running –

Problemi correlati