Django FileField(或ImageField)open()方法为有效文件返回None?

新手上路,请多包涵

让我这样说:

模型.py:

 class Task(models.Model):
    ...
    seq_file = models.FileField(upload_to='files/', blank=True, null=True)
    ...

ajax.py(我正在使用 dajaxice 但没关系):

 ...
def startTask(request, name):
    task = Task.objects.get(task_name=name)
    data = task.seq_file.open()
    filename = os.path.join(settings.MEDIA_ROOT ,task.seq_file.name)
    if not os.path.isfile(filename):
        raise Exception, "file " + filename + " not found."
    sequences = parser.parse(data.read())
    ...

这返回:

 File "/home/mnowotka/Dokumenty/MgrFuncAdnot/app/django-gui/src/gui/ajax.py", line 43, in startTask
sequences = parser.parse(data.read())

AttributeError: 'NoneType' object has no attribute 'read'

但:

 ...
def startTask(request, name):
    task = Task.objects.get(task_name=name)
    filename = os.path.join(settings.MEDIA_ROOT ,task.seq_file.name)
    if not os.path.isfile(filename):
        raise Exception, "file " + filename + " not found."
    data = open(filename)
    sequences = parser.parse(data.read())
    ...

工作完美!为什么?

(我正在使用 Django 1.3)

原文由 mnowotka 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 418
2 个回答

因为 open 方法 models.FileField 不返回任何东西

你可以使用:

 task.seq_file.read()

并且您不需要计算文件路径来检查文件是否存在。你可以使用 task.seq_file.path

 if not os.path.isfile(task.seq_file.path):
    ....

原文由 kosmos342 发布,翻译遵循 CC BY-SA 4.0 许可协议

A FileField 将为您提供一个类似文件的对象,并且无需对其调用 open() 。在您的示例中,只需调用 task.seq_file.file

这是为什么? FileField 有许多存储后端,其中许多没有由磁盘中的文件支持(例如,想想 S3 存储)。我想这就是为什么文档说它返回一个类似文件的对象,而不是一个文件。对于某些类型的存储,“打开”方法没有任何意义。

原文由 Paulo Scardine 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题