[英]How to update a model instance in another model save method in django?
[英]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.