目前,我可以使用FileField
在Django Admin中上传文件。我想要实现的是:
file_size
并将其保存为字段我的models.py
class File(models.Model):
file_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
file_name = models.CharField(max_length=256)
file_mime = models.CharField(max_length=20)
file_size = models.PositiveIntegerField(blank=True, null=True, editable=False)
file_hash = models.CharField(max_length=256, unique=True, blank=True, editable=False)
data = models.FileField(upload_to=get_dynamic_path)
customer_uuid = models.ForeignKey(Customer, on_delete=models.CASCADE)
我试图像这样重写save()
方法:
# models.py
def save(self, *args, **kwargs):
super(File, self).save(*args, **kwargs)
f = self.data.open('rb')
h = hashlib.sha1()
if f.multiple_chunks():
for chunk in f.chunks():
h.update(chunk)
else:
h.update(f.read())
f.close()
self.sha1 = h.hexdigest()
self.file_size = self.data.size
super(File, self).save(*args, **kwargs)
当我上传文件时,它可以上传,但是file_size
和file_hash
字段为空。
我需要更改以下内容:
file_hash
字段中。file_size
字段中。编辑: 修复了StackOverflow上的格式错误,使其类似于我的实际代码。
谢谢!
答案 0 :(得分:1)
有几件事要注意:
1.您不需要两次调用super
,就像mikeyj指出的那样。
2.如果要覆盖保存,请检查是否必须计算哈希。
# models.py
def save(self, *args, **kwargs):
if self.file_size is None:
f = self.data.open('rb')
h = hashlib.sha1()
if f.multiple_chunks():
for chunk in f.chunks():
h.update(chunk)
else: # changed indentation as per my understanding of your code
h.update(f.read())
self.sha1 = h.hexdigest()
self.file_size = self.data.size
f.close() # make sure to close the file after operation is done
super(File, self).save(*args, **kwargs)