Django, создание файла qrcode.png для нового экземпляра в signals.py

Я хочу создать файл qrcode.png и сохранить его в ведро S3 после создания экземпляра в models.Model (с помощью signals.py). С помощью моего кода ниже мне удалось создать файл qrcode__png в локальном базовом каталоге, но он не загружается в мое внешнее ведро S3 и не сохраняется в классе models.Model. ПОМОГИТЕ! Спасибо. Signals.py

@receiver(post_save,sender=inventory)

def create__url_qr(sender, instance, created, **kwargs):

if created == True:
    qr = qrcode.QRCode(
            version=1,
            box_size=10,
            border=5)
    qr.add_data('/MyProperty/item/'+str(instance.id))
    qr.make(fit=True)
    im=qr.make_image(fill_color="black", back_color="white")
    im.save('qrcode___'+str(instance.id)+'.png', format="png")
    print('XXXX')
    print(im)
    print('XXXX')
    inst1 = inventory.objects.get(pk=instance.pk)        
    inst1.qr_code = im
    inst1.save() 

Вы можете прочитать файл, который вы написали, в объект django.core.files.File и затем сохранить этот объект в вашей модели

import qrcode
from django.core.files import File
qr = qrcode.QRCode(
    version=1,
    box_size=10,
    border=5,
)
qr.add_data('/MyProperty/item/'+str(instance.id))
qr.make(fit=True)
im = qr.make_image(fill_color="black", back_color="white")
im.save('qrcode___'+str(instance.id)+'.png', format="png")
qr_file = File(open('qrcode___'+str(instance.id)+'.png'))
inst1 = inventory.objects.get(pk=instance.pk)
inst1.qr_code.save('qrcode___'+str(instance.id)+'.png', qr_file)

Но вам не обязательно сначала сохранять его локально, вы можете просто записать его в BytesIO, а затем сохранить

import qrcode
from io import BytesIO
from django.core.files import File
qr = qrcode.QRCode(
    version=1,
    box_size=10,
    border=5,
)
qr.add_data('/MyProperty/item/'+str(instance.id))
qr.make(fit=True)
im = qr.make_image(fill_color="black", back_color="white")
stream = BytesIO()
im.save(stream, format="png")
qr_file = File(stream)
inst1 = inventory.objects.get(pk=instance.pk)
inst1.qr_code.save('qrcode___'+str(instance.id)+'.png', qr_file)
Вернуться на верх