В настоящее время я могу загружать файлы в Django Admin, используя FileField
.Чего я хочу добиться:
- Создание хэша на основе загруженного файла и сохранение его в виде поля
- Определите
file_size
загруженного файла и сохраните его какполе
My 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
.
EDIT : исправлена ошибка форматирования в StackOverflow, поэтому он напоминал мой фактический код.
Спасибо!