Django - FileField - PDF vs octet-stream - AWS S3

У меня есть модель с полем файла, например, так:

class Document(models.Model):
    file = models.FileField(...)

В другом месте моего приложения я пытаюсь загрузить файл pdf из внешнего url и загрузить его в поле file:

import requests
from django.core.files.base import ContentFile

...

# get the external file:
response = requests.get('<external-url>')

# convert to ContentFile:
file = ContentFile(response.content, name='document.pdf')

# update document:
document.file.save('document.pdf', content=file, save=True)

Однако, я заметил следующее поведение:

  • файлы, загруженные через портал django-admin, имеют content_type "application/json"
  • файлы, загруженные через скрипт abobe, имеют content_type "application/octet-stream"

Как сделать так, чтобы файлы, загружаемые через скрипт, имели "application/json" content_type? Можно ли установить content_type на объект ContentFile? Это важно для фронтенда.

Другие примечания:

  • В качестве системы хранения файлов я использую AWS S3.
  • Загрузка файла из моего локального файлового хранилища через scirpt (т.е. с помощью with open(...) as file: по-прежнему загружает файл как "applicaton/octet-stream"

Решением, как вы понимаете, является простое добавление атрибута content_type к экземпляру ContentFile:

import requests
from django.core.files.base import ContentFile

...

# get the external file:
response = requests.get('<external-url>')

# convert to ContentFile:
file = ContentFile(response.content, name='document.pdf')
file.content_type = "application/pdf"  # <-- this

# update document:
document.file.save('document.pdf', content=file, save=True)
Вернуться на верх