Вот моя модель. Я хочу создать новый файл и перезаписать существующий при каждом сохранении экземпляра модели:
class Kitten(models.Model):
claw_size = ...
license_file = models.FileField(blank=True, upload_to='license')
def save(self, *args, **kwargs):
#Generate a new license file overwriting any previous version
#and update file path
self.license_file = ???
super(Request,self).save(*args, **kwargs)
Я вижу много документации о том, как загрузить файл. Но как мне создать файл, назначить его полю модели и заставить Django сохранить его в нужном месте?
convert_to_pdf
. Спасибо!!f = open('/path/to/file', 'r')
дляf = open('/path/to/file.zip', 'rb')
MEDIA_ROOT
не использовался совместно с тем же томом в celery worker. Совместное использование названного тома исправило это ( ref ).Принятый ответ, безусловно, хорошее решение, но вот как я создал CSV и обслужил его из представления.
Думал, что стоит поместить это здесь, поскольку мне потребовалось немного возиться, чтобы получить все желаемое поведение (перезаписать существующий файл, сохранить в нужном месте, не создавать дублирующиеся файлы и т. Д.).
Django 1.4.1
Python 2.7.3
источник
Хорошей практикой является использование диспетчера контекста или вызова
close()
в случае исключений во время процесса сохранения файла. Это может произойти, если серверная часть хранилища не работает и т. Д.Любое поведение перезаписи должно быть настроено в вашем хранилище. Например, у S3Boto3Storage есть настройка
AWS_S3_FILE_OVERWRITE
. Если вы используете,FileSystemStorage
вы можете написать собственный миксин .Вы также можете вызвать метод save модели вместо метода save FileField, если хотите, чтобы произошли какие-либо пользовательские побочные эффекты, такие как отметки времени последнего обновления. В этом случае вы также можете установить атрибут имени файла равным имени файла, относящемуся к
MEDIA_ROOT
. По умолчанию используется полный путь к файлу, что может вызвать проблемы, если вы его не зададите - см. File .__ init __ () и File.name .Вот пример, где
self
находится экземпляр модели, гдеmy_file
FileField / ImageFile, вызывающийsave()
весь экземпляр модели, а не только FileField:источник