سؤال

أحتاج إلى استيراد بعض البيانات من ملف Excel ومجلد مع صور ، يصف كل صف في Excel كل إدخال ولديه قائمة بأسماء الملفات في المجلد (الصور المتعلقة بالإدخال).

لقد قمت بعمل برنامج نصي يقوم بإنشاء كل إدخال في قاعدة البيانات ويحفظه على قشرة Django ، لكن ليس لدي أي فكرة عن كيفية إنشاء مثيل للعلم الداخلي لإنقاذه مع النموذج.

في Django 1.0 كان لدي هذا الفصل الصغير الذي سمح لي بالقيام بما أحتاج إليه ، ولكن مع التغييرات في Django 1.1 لم يعد يعمل.

class ImportFile(file):
    def __init__(self, *args, **kwargs):
        super(ImportFile, self).__init__(*args, **kwargs)
        self._file = self
        self.size = os.path.getsize(self.name)

    def __len__(self):
        return self.size

    def chunks(self, chunk_size=None):
        self._file.seek(0)
        yield self.read()

كنت أستخدم هذه الفئة مع هذه القطعة من التعليمات البرمجية لتحميل الصور وحفظها مع مثيل النموذج.

for photo in photos:
    f = ImportFile(os.path.join(IMPORT_DIR, 'fotos', photo), 'r')
    p = Photo(name=f.name, image=f, parent=supply.supply_ptr)
    name = str(uuid1()) + os.path.splitext(f.name)[1]
    p.image.save(name, f)
    p.save()

والسؤال هو ، كيف يمكنني إنشاء inmymoryuploadedfile أو مؤقتة adloadedfile من ملف في بيثون؟ ، أو أي شيء آخر يمكن أن يعمل في هذا السياق.

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

المحلول

وأخيرا وجدت الجواب.

from django.core.files import File

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'r'))
p = Photo(name=f.name, image=f, parent=supply.supply_ptr)
name = str(uuid1()) + os.path.splitext(f.name)[1]
p.image.save(name, f)
p.save()

نصائح أخرى

إذا كنت تستخدم بيثون 3 هناك حاجة إلى تعديل واحد - تغيير "R" إلى "RB":

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'rb'))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top