Как загружать изображения на носитель Django без подкаталога

Мне нужно загрузить изображение в Django ImageField, но из-за ограничения, основанного на стороннем API, мне нужно, чтобы изображения загружались в каталог мультимедиа без подкаталога.

Ограничение связано с тем, что имя файла, хранящееся локально (в столбце поля изображения), используется для вычисления хэша для запроса этого изображения из мультимедийного API, поэтому поле должно содержать то же имя, что и имя файла в API, к сожалению, Имя файла API не может содержать косую черту.

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

Я попытался сделать upload_to вызываемым, который возвращает пустую строку, которая, кажется, позволяет обойти ошибку upload_to required, но все изображения затем сохраняются как просто '' (blank) _1, _2 ... и т. Д. Без остальной части изображения название.

Я также попытался заставить upload_to возвращать '/', '../media', '../media/' - все безрезультатно (различные ошибки или искаженные имена файлов)

Итак, TL; DR, как сохранять изображения прямо в MEDIA_ROOT, без подкаталога?

РЕДАКТИРОВАТЬ, дополнительная информация:

Итак, я просто попробовал небольшой хак, который делает его частью:

from django.core.files.storage import FileSystemStorage

media_root_store = FileSystemStorage(location='/path/to/media/parent')

class MyModel(models.Model):
    img_file = models.ImageField(
        max_length=255,
        upload_to='media',
        storage=media_root_store)

Этот грязный прием сохраняет изображение в правильном месте, хотя очевидно, что путь к изображению сохраняется с добавлением media /. Так что я не уверен, что это на самом деле приблизило меня.


person Tom Manterfield    schedule 10.06.2013    source источник


Ответы (1)


Оказывается, в моей предыдущей попытке была довольно большая подсказка об ошибке (та, которая генерировала _1, _2 и т. Д.)

Если я укажу вызываемую функцию upload_to, которая просто возвращает аргумент имени файла, тогда изображение будет сохранено непосредственно в MEDIA_ROOT с правильным именем файла, сохраненным в базе данных (без префикса каталога).

У меня создалось впечатление, что upload_to просто предоставит путь для добавления к MEDIA_ROOT, к которому затем будет добавлено имя файла изображения. Оказывается, это неверно.

person Tom Manterfield    schedule 10.06.2013