This commit is contained in:
18
backend/competition/migrations/0013_projectfile_file_size.py
Normal file
18
backend/competition/migrations/0013_projectfile_file_size.py
Normal file
@@ -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='文件大小(字节)'),
|
||||
),
|
||||
]
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -39,16 +39,30 @@ 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:
|
||||
return 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()
|
||||
|
||||
Reference in New Issue
Block a user