如何在FileField内容上使用验证器

时间:2017-05-03 21:19:09

标签: django django-models django-validation

在我的模型中,我想使用验证器来分析文件的内容,我无法弄清楚的是如何访问文件的内容以通过它解析,因为文件尚未保存(当验证器正在运行时,这很好。

我不明白如何将传递给验证程序的'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()])

感谢您的帮助!

2 个答案:

答案 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 验证器的 FileFieldFieldFile 的一个实例,正如 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

documentation 说:

<块引用>

除了继承自 File 的 API(例如 read()write())外,FieldFile 还包括几个可用于与底层文件交互的方法:.. .

FieldFile 类提供

<块引用>

... Storage.open() 方法结果的包装器,它可能是一个 File 对象,也可能是 File API 的自定义存储实现。

此类底层文件实现的一个示例是 InMemoryUploadedFile docs/source

同样来自docs

<块引用>

File 类是 Python 文件对象的瘦包装器,其中包含一些 Django 特定的附加功能

另请注意:class-based validators vs function-based validators

相关问题