كيف يمكنني استخدام Datamigration من South لتغيير حالة التخزين الخلفية لمثيل Imagefield Model Model؟

StackOverflow https://stackoverflow.com/questions/3545005

سؤال

أحاول ترحيل بعض النماذج Imagefields إلى استخدام S3BotoStorage التخزين الخلفية من django-storages. كجزء من هذه العملية ، قمت بتغيير إعلان Imagefield الخاص بنموذج النموذج لي لتضمين storage=instance_of_s3botostorage الحجة ، والحالات الجديدة من النموذج الخاص بي التي تنقذ صورة إلى سمة ImageField يتم تخزينها الآن في S3 - على النحو المقصود.

حاولت نقل مثيلات النموذج الحالية إلى تخزين بياناتهم في S3 أيضًا ، لذلك كتبت هجرة من جنوب Datamigration مثل هذا:

def forwards(self, orm):
    "upload ImageField file to S3 if it's not already in there"
    for mymodel in orm.MyModel.objects.all():
        if mymodel.logo_image and not isinstance(mymodel.logo_image.storage, S3BotoStorage):
            print "uploading %s to S3" % mymodel.logo_image
            file_contents = ContentFile(mymodel.logo_image.read())
            mymodel.logo_image.save(mymodel.logo_image.name, file_contents)
            mymodel.save()

ولكن من الواضح أن هذا ليس له التأثير المقصود لأن ملف الصورة يتم حفظه ببساطة باستخدام القديم storage الواجهة الخلفية - وهو أمر منطقي بالنظر إلى Save () هو في الواقع طريقة FieldFile تابعة ل FileField

لذلك ، كيفية نقل/تغيير تخزين الملفات على مثيل من النموذج؟

هل كانت مفيدة؟

المحلول

لذلك ، تبين أن التخزين المعين المستخدم للملفات لا يتم تخزينه في قاعدة البيانات. "Migration" هي ببساطة مسألة تغيير تعريف النموذج ، ثم خارج استخدام واجهة برمجة تطبيقات النظام الفرعي للتخزين ، ما عليك سوى تحميل الملفات إلى مواقع التخزين الجديدة.

نصائح أخرى

أود أن أنظر إلى نظام مثل هذا لمشكلتك. http://github.com/seanbrant/django-queued-storage

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top