كيف يمكنني استخدام Datamigration من South لتغيير حالة التخزين الخلفية لمثيل Imagefield Model Model؟
-
30-09-2019 - |
سؤال
أحاول ترحيل بعض النماذج 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