Django models.FileField — хранить только имя файла, а не пути или ссылки на папки.

Я использую сайт администратора Django для управления некоторыми данными, но не создаю веб-приложение. Мне нужно поле загрузки файла для хранения только имени файла в базе данных.

Прямо сейчас я могу получить абсолютные пути, например: /Users/me/uploads/file.png

Или с помощью параметра upload_to получить в базе что-то вроде этого: uploads/file.png

Как мне сделать так: file.png

РЕДАКТИРОВАТЬ:

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

Спасибо!


person gngrwzrd    schedule 04.04.2013    source источник


Ответы (2)


Аргумент upload_to FileField может быть вызываемым. см. документацию

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

def only_filename(instance, filename):
    return filename

class MyModel(models.Model):
    file = models.FileField(upload_to=only_filename)
person luc    schedule 05.04.2013

Я бы сохранил FileField и использовал python os.path.basename для извлечь имя файла.

Это может быть инкапсулировано с помощью свойства

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

   @property
   def filename(self):
       return os.path.basename(self.file.name)
person luc    schedule 04.04.2013
comment
os.path.basename - это то, что вы ищете, но ответ Люка здесь действительно инкапсулирует его очень django/pythonesque. - person GordonsBeard; 04.04.2013
comment
На самом деле это не поможет - мы используем базу данных sqllite в другом клиенте, поэтому я бы хотел, чтобы все пути были полностью удалены. - person gngrwzrd; 05.04.2013
comment
Я думаю, что более понятно опубликовать редактирование в другом ответе. - person luc; 05.04.2013