Создать объект Django с полем FileField с помощью обертки `File` и in-memory-file?
Я пытаюсь создать функциональность в моем приложении, где будет создан In-memory PDF файл и этот файл будет сохранен на FileField
в моей Document
модели.
Объяснение процесса:
from io import BytesIO
from PyPDF2 import PdfWriter
in_memory_file = BytesIO()
writer = PdfWriter()
writer.add_blank_page(height=200, width=200)
writer.write(in_memory_file)
# The contents of the `writer` got saved to the `io` file
Для сохранения созданного выше файла мы можем сделать следующее
with open('new_local_file.pdf', 'wb') as local_file:
local_file.write(in_memory_file.getbuffer())
Приведенный выше код отлично работает в терминале, но поскольку я не могу создавать локальные копии в моем приложении Django, мне приходится делать что-то вроде этого, чтобы сохранить файл
from django.core.files import File
obj = Document.objects.create(file_result=File(in_memory_file.getbuffer()))
Обертка File принимает объект файла python, но все равно приведенный выше код не работает.
После выполнения не создается файл в моем Django Admin
Пожалуйста, прокомментируйте, если вам нужна дополнительная информация.
Если вы хотите сохранить сгенерированный файл в поле модели, вы должны сохранить его в каталоге media, И вы можете сохранить файл по пути:
from django.conf import settings
filename = "document.pdf"
directory = f"{settings.MEDIA_ROOT}/{filename}"
...
# in_memory_file generated here
...
with open(directory, 'wb') as local_file:
local_file.write(in_memory_file.getbuffer())
obj = Document()
obj.file_result.name = filename
obj.save()