use*_*617 6 python django file
我在django中打开存储在我的数据库中的文本文件时遇到问题.我想通过我的模型的FileField访问它...模型看起来像这样
class MyModel(models.Model):
saved_file = FileField()
Run Code Online (Sandbox Code Playgroud)
我通过管理界面上传了一个测试文件,工作正常.在我看来,我想访问此文件.如果我用标准的python open()打开它就可以了......
f = open(path, 'r')
a = f.readlines()
return render_to_response('base.html', {'content': a}, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
这显示文件的行确定...根据https://docs.djangoproject.com/en/dev/ref/models/fields/#filefield,当调用模型中的FileField时,会得到一个FieldFile代理,所以
f = MyModel.objects.all().get(id=0).saved_file
Run Code Online (Sandbox Code Playgroud)
应该将FieldFile存储在f中,此外文档说明通过在FieldFile上强制转换.open(mode ='rb')从模型打开文件,所以
file = f.open(mode='rb')
Run Code Online (Sandbox Code Playgroud)
应该像文档中所述的python .open()一样工作.所以,为了得到我做的台词
file.readlines()
Run Code Online (Sandbox Code Playgroud)
应该返回我的行列表.发生的事情是我得到一个错误,说.readlines()属性不存在.我不需要该文件来显示它,这只是一种测试打开文件是否有效的方法,但我需要在我的视图中的变量中的文件内容以进一步在我的业务逻辑中使用它.任何人都可以建议一种方法从FileField frem模型中获取文件内容吗?
FieldFile.open打开文件,但不返回任何内容.所以在你的例子file中None.
您应该在FieldFile上调用readlines.在您的示例中,它将是:
f = MyModel.objects.all().get(id=0).saved_file
f.open(mode='rb')
lines = f.readlines()
f.close()
Run Code Online (Sandbox Code Playgroud)
文档说明文件默认以 'rb' 模式打开,但您希望在 'r' 中打开以将文件视为文本文件:
my_object = MyModel.objects.get(pk=1)
try:
my_object.saved_file.open('r')
lines = my_object.saved_file.readlines()
finally:
my_object.saved_file.close()
Run Code Online (Sandbox Code Playgroud)
更好的是,您可以在 Django v2.0+ 中使用上下文管理器
my_object = MyModel.objects.get(pk=1)
with my_object.saved_file.open('r') as f:
lines = f.readlines()
Run Code Online (Sandbox Code Playgroud)