Перейти к главному содержимому

Как сохранить файл, доступный по ссылке в поле модели Django

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

Код простой:

import requests
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile
from django.db.models.fields.files import FieldFile
from django.db.models import Model


def save_file_from_url(model, url, save_to=None, filename=None):
    """
    Сохранить файл, доступный по адресу ``url`` в поле ``save_to`` модели ``model``.

    Аргументы:
        model — объект класса Model, либо FieldFile / ImageFieldFile
        url — ссылка на файл
        save_to — название файлового поля
        filename — новое имя для сохраняемого файла

    Примеры использования:
        save_file_from_url(gallery, '<url>', save_to='image')
        save_file_from_url(gallery.image, '<url>')
    """
    assert isinstance(model, (FieldFile, Model)), '"model" argument should be a Model or FieldFile instance'

    if isinstance(model, FieldFile):
        field = model
    else:
        assert isinstance(save_to, str), '"save_to" argument must be provided along with Model instance'
        field = getattr(model, save_to)

    r = requests.get(url)

    if not filename:
        filename = url.split('/')[-1]

    temp_file = NamedTemporaryFile(delete=True)
    temp_file.write(r.content)
    temp_file.flush()

    field.save(filename, File(temp_file), save=True)

Вот ещё несколько примеров реализации:

Единственное, что стоит учесть — в данной реализации используется библиотека requests, которая не умеет открывать локальные файлы (file:///tmp/file.txt).

Комментарии

Comments powered by Disqus