2014-09-03 19 views
15

Tôi đang cố gắng nâng cấp một ứng dụng django từ django 1.6.6 lên 1.7 và đang sử dụng python 2.7.8. Khi tôi chạy python manage.py makemigrations, tôi nhận được lỗi sau:Nâng cấp lên Django 1.7. Lỗi: Không thể tuần tự hóa: <storages.backends.s3boto.S3BotoStorage đối tượng

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

Và đây là đoạn code liên quan:

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)]) 

Tôi đã đọc các tài liệu di cư và đọc về một vấn đề tương tự here, nhưng tôi đã không thể giải quyết vấn đề này. Ứng dụng của tôi sử dụng django-storages và boto để lưu các tệp vào Amazon S3. Bất kỳ trợ giúp được đánh giá cao.

Trả lời

26

Chỉ cần tạo một lớp con có thể tháo rời và sử dụng nó thay thế.

from django.utils.deconstruct import deconstructible 


@deconstructible 
class MyS3BotoStorage(S3BotoStorage): 
    pass 
+3

'từ django.utils.deconstruct import deconstructible' – Druska

6

Vấn đề cơ bản ở đây là bạn đang cố gắng sử dụng Django 1.7 với gói (django-storages) có vẻ như chưa được cập nhật để hoạt động với phiên bản đó.

Dưới đây là một số trích đoạn từ documentation để giải thích những gì đang xảy ra:

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.

Vì vậy, các giải pháp ở đây là để cung cấp cho các lớp storages.backends.s3boto.S3BotoStorage một phương pháp deconstruct(). Điều đó có thể sẽ dễ dàng như việc áp dụng trang trí lớp học @deconstructible.

Có lẽ gói sẽ kết hợp thay đổi này tại một thời điểm nào đó (hoặc có thể là chi nhánh chính đã có nó?), Nhưng bạn cũng có thể tự vá nó.

+0

'' '@deconstructible lớp MyS3BotoStorage (S3BotoStorage): pass''' –

+0

Các bình luận về django-kho cố định nó cho tôi. Tôi đã nâng cấp và chăm sóc mọi thứ. Trong hoàn cảnh của tôi, sử dụng @deconstructible thì không. – Guerry

+0

Đối với phương thức ** deconstruct() ** tùy chỉnh - hãy xem http://stackoverflow.com/questions/31953802/upgrading-from-django-1-6-to-1-7-getting-callable-is-not- serialize-when-running –

Các vấn đề liên quan