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.Filedjango.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