From f1f1e0df5a601b125d9bb64447a8b6e39cf6672d Mon Sep 17 00:00:00 2001 From: jeremygan2021 Date: Mon, 23 Mar 2026 00:15:21 +0800 Subject: [PATCH] debug4 --- .../migrations/0013_projectfile_file_size.py | 18 ++++++++++++++++++ backend/competition/models.py | 1 + backend/competition/serializers.py | 18 +++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 backend/competition/migrations/0013_projectfile_file_size.py diff --git a/backend/competition/migrations/0013_projectfile_file_size.py b/backend/competition/migrations/0013_projectfile_file_size.py new file mode 100644 index 0000000..702cab6 --- /dev/null +++ b/backend/competition/migrations/0013_projectfile_file_size.py @@ -0,0 +1,18 @@ +# Generated by Django 6.0.1 on 2026-03-22 16:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('competition', '0012_alter_competition_cover_image_url_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='projectfile', + name='file_size', + field=models.BigIntegerField(blank=True, null=True, verbose_name='文件大小(字节)'), + ), + ] diff --git a/backend/competition/models.py b/backend/competition/models.py index 61ee049..05c3fd8 100644 --- a/backend/competition/models.py +++ b/backend/competition/models.py @@ -297,6 +297,7 @@ class ProjectFile(models.Model): file = models.FileField(upload_to='competitions/projects/files/', verbose_name="文件", null=True, blank=True) file_url = models.TextField(verbose_name="文件链接", null=True, blank=True, help_text="OSS URL或外部链接") + file_size = models.BigIntegerField(verbose_name="文件大小(字节)", null=True, blank=True) name = models.CharField(max_length=100, verbose_name="文件名称", blank=True) diff --git a/backend/competition/serializers.py b/backend/competition/serializers.py index 219403b..061f062 100644 --- a/backend/competition/serializers.py +++ b/backend/competition/serializers.py @@ -39,15 +39,29 @@ class CompetitionEnrollmentSerializer(serializers.ModelSerializer): class ProjectFileSerializer(serializers.ModelSerializer): file_url_display = serializers.SerializerMethodField() + file_size_display = serializers.SerializerMethodField() class Meta: model = ProjectFile - fields = ['id', 'project', 'file_type', 'file', 'file_url', 'name', 'created_at', 'file_url_display'] + fields = ['id', 'project', 'file_type', 'file', 'file_url', 'file_size', 'name', 'created_at', 'file_url_display', 'file_size_display'] def get_file_url_display(self, obj): if obj.file: return obj.file.url return obj.file_url + + def get_file_size_display(self, obj): + if not obj.file_size: + return None + size = obj.file_size + if size < 1024: + return f"{size} B" + elif size < 1024 * 1024: + return f"{size / 1024:.1f} KB" + elif size < 1024 * 1024 * 1024: + return f"{size / (1024 * 1024):.1f} MB" + else: + return f"{size / (1024 * 1024 * 1024):.2f} GB" def validate_file(self, value): if not value: @@ -87,6 +101,8 @@ class ProjectFileSerializer(serializers.ModelSerializer): if not validated_data.get('name'): validated_data['name'] = file_obj.name + validated_data['file_size'] = file_obj.size + try: from ai_services.services import AliyunTingwuService service = AliyunTingwuService()