更新实例Django模型保存方法中的FileField值

问题描述 投票:1回答:3

最好的方法是用文件的行总数更新total字段?以模型或视图或其他方式实施?如何进行文件注册将始终通过django-admin

models.py

class Registry(models.Model):

   file_upload = models.FileField(blank=True, null=False) #csv or xlsx
   total = models.CharField(max_length=100, null=True, blank=True, default=None)

   def save(self):
     with open(self.file_upload) as f:
        self.total = sum(1 for line in f)
        return self.total

错误:

 TypeError: expected str, bytes or os.PathLike object, not FieldFile
python django django-models
3个回答
3
投票

您可以简单地使用.read()方法读取上载文件的文件内容。

然后执行该内容的任何您想做的事情。

def save(self):
    self.total = sum(1 for line in self.file_upload.read())
    super(Registry, self).save(*args, **kwargs) 

无需再次在操作系统级别打开。


1
投票

self.file_upload的输出是一个FieldFile对象。您应该将其更改为self.file_upload.path,在此将为您提供文件的字符串路径。

并且要确保您的self.file_upload不为None / Null,还应该对其进行验证。

def save(self):
    if self.file_upload:
        with open(self.file_upload.path) as f:
            ....

您可以阅读此文档以了解更多https://docs.djangoproject.com/en/dev/topics/files/#using-files-in-models


0
投票

如果需要在大多数将要创建的实例中使用该方法,通常会选择模型零件。但是在这种情况下,我可能选择Django Forms来处理此业务逻辑。顺便说一下,您可以选择所有可能性。至少在两种情况下都可以实现所需的功能。如果业务逻辑经常更改,我建议将这些逻辑移至视图或表单。您遇到的错误与open语句有关,它需要在错误消息中声明的类型之一。为此,您可以将self.file_upload更改为self.file_upload.path,这是文件上传的路径。我强烈建议您使用csv模块或excel文件库来处理文件读取操作。

© www.soinside.com 2019 - 2024. All rights reserved.