最好的方法是用文件的行总数更新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
您可以简单地使用.read()
方法读取上载文件的文件内容。
然后执行该内容的任何您想做的事情。
def save(self):
self.total = sum(1 for line in self.file_upload.read())
super(Registry, self).save(*args, **kwargs)
无需再次在操作系统级别打开。
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
如果需要在大多数将要创建的实例中使用该方法,通常会选择模型零件。但是在这种情况下,我可能选择Django Forms来处理此业务逻辑。顺便说一下,您可以选择所有可能性。至少在两种情况下都可以实现所需的功能。如果业务逻辑经常更改,我建议将这些逻辑移至视图或表单。您遇到的错误与open语句有关,它需要在错误消息中声明的类型之一。为此,您可以将self.file_upload
更改为self.file_upload.path
,这是文件上传的路径。我强烈建议您使用csv模块或excel文件库来处理文件读取操作。