Django: сохранить ContentFile (или какой-то виртуальный файл) в базу данных

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

class Foo(models.Model):
    bar1=models.ForeignKey(Table1)
    bar2=models.ForeignKey(Table2)
    res=models.FileField(upload_to='MYPATH')

Проблема в том, что для создания экземпляра Foo мне нужно сначала создать физический файл на диске сервера, что означало бы, что будут созданы две копии (одна для меня, чтобы создать запись в базе данных, одна для django при сохранении записи.).

Насколько я вижу, я должен сам создать файл в 'MYPATH', и вместо использования FileField, я должен сохранить ссылку в базе данных (по сути, что делает django????). Однако я сомневаюсь, что это лучший метод, как

  1. Это не кажется мне питонским.
  2. У меня не будет доступа к тем же методам, что и при использовании реального FileField. Например, при его вызове у меня не будет FieldFile, а будет только строка ссылки.

По сути, я хотел сделать следующее: String -> ContentFile (или некоторая форма "виртуального" файла) -> Physical File, обрабатываемый Django при сохранении записи в базе данных.

entry = Foo(bar1=var1, bar2=var2, res=ContentFile(XMLSTRING))
entry.save()

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

  1. Как сохранить файл в базе данных без его физического создания (использование ContentFile не создает физический файл после сохранения записи, что я и хочу сделать)
  2. Заставьте django не загружать данный файл, а использовать уже загруженную версию, сохраняя при этом все методы, предоставляемые FileField
  3. Что я не понимаю

Я прошу прощения за [мой английский, мое непонимание, отсутствие ясности]

Все, что вам нужно знать, я с удовольствием уточню.

РЕДАКТИРОВАТЬ: Я посмотрел на эту тему, но там, urlretrieve создает временный файл, что я не хочу делать. Может быть, я должен сделать это, но есть ли лучший способ?

0 ответов

Другие вопросы по тегам