Django – 如何创build一个文件并将其保存到模型的FileField?
这是我的模型。 我想要做的是生成一个新的文件,并覆盖现有的一个模型实例保存:
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将其存储在正确的位置?
你想看看Django文档中的FileField和FieldFile ,尤其是FieldFile.save() 。
基本上,一个被声明为FieldFile
的字段在被访问的时候,会给你一个FieldFile
类的实例,它提供了几个与基础文件交互的方法。 所以,你需要做的是:
self.license_file.save(new_name, new_contents)
其中new_name
是您希望分配的文件名, new_name
是文件的内容。 请注意, new_contents
必须是django.core.files.File
或django.core.files.base.ContentFile
(有关详细信息,请参阅指定手册的链接)。 这两个select归结为:
# 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'))
接受的答案当然是一个很好的解决scheme,但这里是我生成一个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
认为这是值得的,因为它花了我一点儿的摆弄,以获得所有可取的行为(覆盖现有的文件,存储到正确的位置,而不是创build重复的文件等)。
Django 1.4.1
Python 2.7.3