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