繁体   English   中英

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

[英]Update FileField value in instance Django Model save method

用文件总行数更新总字段的最佳方法是什么? 在 model 或视图或其他中实现? 如何使文件注册将始终通过 django-admin

模型.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

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

然后对这些内容做任何你想做的事情。

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

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

self.file_upload 的self.file_upload是一个FieldFile object。 您应该将其更改为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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM