Django-как создать файл и сохранить его в файловое поле модели?
вот моя модель. Что я хочу сделать, это создать новый файл и перезаписать существующий всякий раз, когда экземпляр модели сохраняется:
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?
3 ответа:
вы хотите взглянуть на FileField и FieldFile в документах Django, и особенно FieldFile.сохранить().
в основном, поле объявлено как
FileField
, при обращении, дает вам экземпляр классаFieldFile
, который дает вам несколько методов для взаимодействия с базовым файлом. Итак, что вам нужно сделать, это:self.license_file.save(new_name, new_contents)
здесь
new_name
это имя файла, которое вы хотите назначить иnew_contents
содержание файла. Заметить чтоnew_contents
должен быть экземпляр либоdjango.core.files.File
илиdjango.core.files.base.ContentFile
(подробности см. В приведенных ссылках на руководство). Два варианта сводятся к следующему:# Using File f = open('/path/to/file') self.license_file.save(new_name, File(f)) # Using ContentFile self.license_file.save(new_name, ContentFile('A string with the file content'))
принятый ответ, безусловно, является хорошим решением, но вот как я пошел на создание CSV и обслуживание его из представления.
#Model class MonthEnd(models.Model): report = models.FileField(db_index=True, upload_to='not_used') import csv from os.path import join #build and store the file def write_csv(): path = join(settings.MEDIA_ROOT, 'files', 'month_end', 'report.csv') f = open(path, "w+b") #wipe the existing content f.truncate() csv_writer = csv.writer(f) csv_writer.writerow(('col1')) for num in range(3): csv_writer.writerow((num, )) month_end_file = MonthEnd() month_end_file.report.name = path month_end_file.save() from my_app.models import MonthEnd #serve it up as a download def get_report(request): month_end = MonthEnd.objects.get(file_criteria=criteria) response = HttpResponse(month_end.report, content_type='text/plain') response['Content-Disposition'] = 'attachment; filename=report.csv' return response
подумал, что стоит поставить это здесь, так как мне потребовалось немного повозиться, чтобы получить все желаемое поведение (перезаписать существующий файл, хранить в нужном месте, не создавать дубликаты файлов и т. д.).
Django 1.4.1
Python 2.7.3