diff --git a/core/backend/apps/assets/serializers.py b/core/backend/apps/assets/serializers.py index c15f82e..311a461 100644 --- a/core/backend/apps/assets/serializers.py +++ b/core/backend/apps/assets/serializers.py @@ -1,9 +1,23 @@ +from django.conf import settings from rest_framework import serializers from .models import Asset, AssetFile +from .storage import TosStorage + + +_tos_storage = None + + +def _tos(): + global _tos_storage + if _tos_storage is None: + _tos_storage = TosStorage() + return _tos_storage class AssetFileSerializer(serializers.ModelSerializer): + preview_url = serializers.SerializerMethodField() + class Meta: model = AssetFile fields = [ @@ -18,7 +32,28 @@ class AssetFileSerializer(serializers.ModelSerializer): "preview_url", "is_primary", ] - read_only_fields = fields + read_only_fields = [ + "id", + "object_key", + "bucket", + "content_type", + "size_bytes", + "width", + "height", + "duration_ms", + "is_primary", + ] + + def get_preview_url(self, obj): + # 存储字段优先(如外部已写入绝对 URL);否则用 object_key 实时签发 TOS 预签名 GET URL + if obj.preview_url: + return obj.preview_url + if not obj.object_key or not settings.TOS.get("endpoint"): + return "" + try: + return _tos().presigned_get_url(object_key=obj.object_key) + except Exception: + return "" class AssetSerializer(serializers.ModelSerializer):