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

Pat*_*ick 6 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()])
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助!

Tod*_*dor 3

看看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
Run Code Online (Sandbox Code Playgroud)