在我的模型中,我想使用验证器来分析文件的内容,我无法弄清楚的是如何访问文件的内容以通过它解析,因为文件尚未保存(当验证器正在运行时,这很好。
我不明白如何将传递给验证程序的'value'中的数据转换成文件(我假设我应该使用tempfile),然后我可以打开它并评估数据。
这是一个简化的例子,在我的实际代码中,我想打开文件并使用csv对其进行评估。
在Models.py
中class ValidateFile(object):
....
def __call__(self, value):
# value is the fieldfile object but its not saved
# I believe I need to do something like:
temp_file - tempfile.TemporaryFile()
temp_file.write(value.read())
# Check the data in temp_file
....
class MyItems(models.Model):
data = models.FileField(upload_to=get_upload_path,
validators=[FileExtensionValidator(allowed_extensions=['cv']),
ValidateFile()])
感谢您的帮助!
答案 0 :(得分:2)
看看ImageField实施中如何做到这一点:
所以你的ValidateFile
课可能是这样的:
from io import BytesIO
class ValidateFile(object):
def __call__(self, value):
if value is None:
#do something when None
return None
if hasattr(value, 'temporary_file_path'):
file = value.temporary_file_path()
else:
if hasattr(value, 'read'):
file = BytesIO(value.read())
else:
file = BytesIO(value['content'])
#Now validate your file
答案 1 :(得分:0)
不需要tempfile
:
传递给 value
验证器的 FileField
是 FieldFile
的一个实例,正如 OP 已经提到的那样。
在幕后,FieldFile
实例可能已经使用了 tempfile.NamedTemporaryFile
(source),或者它可能包装了一个 in-memory file,但您不必担心:
要“评估数据”,您可以简单地将 FieldFile
实例视为任何 Python file object。
例如,您可以对其进行迭代:
def my_filefield_validator(value):
# note that value is a FieldFile instance
for line in value:
... # do something with line
<块引用>
除了继承自 File
的 API(例如 read()
和 write()
)外,FieldFile
还包括几个可用于与底层文件交互的方法:.. .
和 FieldFile
类提供
... Storage.open()
方法结果的包装器,它可能是一个 File
对象,也可能是 File
API 的自定义存储实现。>
此类底层文件实现的一个示例是 InMemoryUploadedFile
docs/source。
同样来自docs:
<块引用>File
类是 Python 文件对象的瘦包装器,其中包含一些 Django 特定的附加功能