在使用Django模型中的FileField字段上传文件后,如果想获取上传的文件的大小,该怎么办呢?虽然Django提供了FieldFile.siz方法,但是该方法获取的文件大小的单位是字节,不够人性化,那么如何更人性化(KB、MB、GB)的获取上传文件的大小呢?
解决方案- 在模型文件(models.py)中添加添加属性方法filesize():
from django.db import models from django.contrib.auth.models import User # Create your models here class Media(models.Model): media_file = models.FileField(upload_to='./', max_length=500, verbose_name='媒体文件', blank=True, null=True, help_text='请选择上传文件') media_name = models.CharField(max_length=512, verbose_name='媒体名称', blank=True, help_text='默认为媒体文件名,亦可手动设置') media_size = models.CharField(max_length=135, verbose_name='媒体大小', blank=True) media_creator = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, verbose_name='媒体创建者') ...... class meta: db_table = 'mms' verbose_name = '媒体' verbose_name_plural = '媒体' ordering = ['-media_modification_time'] def __str__(self): return self.media_name @property def filesize(self): x = self.media_file.size y = 512000 if x < y: value = round(x / 1024, 2) ext = ' KB' elif x < y * 1024: value = round(x / (1024 * 1024), 2) ext = ' MB' else: value = round(x / (1024 * 1024 * 1024), 2) ext = ' GB' return str(value) + ext - 通过属性方法filesize()获取上传文件的大小(admin.py)
from django.contrib import admin from mms.models import Media # Register your models here. class MediaAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): # 设置媒体创建者 if not obj.media_creator: obj.media_creator = request.user obj.last_editor = request.user # 设置媒体名称 if not obj.media_name: obj.media_name = obj.media_file.name # 设置媒体大小 if not obj.media_size: obj.media_size = obj.filesize super().save_model(request, obj, form, change) admin.site.register(Media, MediaAdmin)



