Django Encrypt FileField with Fernet object has no attribute '_committed' occurred

Я передаю несколько загрузок pdf в представление из формы. (используя Uppy.XHRUpload)

Я хочу зашифровать их перед сохранением в модели.

Когда я тестирую файлы, они могут быть зашифрованы и сохранены в файл, а затем прочитаны и расшифрованы просто отлично.

Но когда я пытаюсь добавить в модель, я получаю:

 'bytes' object has no attribute '_committed' occurred.

Я могу загрузить зачисленный файл, перечитать и затем сохранить, но это будет пустой тратой времени.

Я думал, что это будет так же просто, как:

if request.method == 'POST' and request.FILES:

    files = request.FILES.getlist('files[]')

    for index, file in enumerate(files):

        f = Fernet(settings.F_KEY)

        pdf = file.read()
        encrypted = f.encrypt(pdf)

        PDF_File.objects.create(
            acct = a,
            pdf = encrypted
        )

Модель.

class PDF_File(models.Model):

     acct = models.ForeignKey(Acct, on_delete=models.CASCADE)
     pdf = models.FileField(upload_to='_temp/pdf/')

Спасибо за помощь.

это потому что вы не можете сохранить encrrypted(bytes) в модель

попробуйте это

from django.core.files.base import ContentFile

for index, file in enumerate(files):
    f = Fernet(settings.F_KEY)
    pdf = file.read()
    encrypted = f.encrypt(pdf)
    content_file = ContentFile(encrypted, name=your_filename)
    PDF_File.objects.create(
        acct = a,
        pdf = content_file
    )

ссылка отсюда https://docs.djangoproject.com/en/4.0/topics/http/file-uploads/

Вернуться на верх