From 3748da1af7f46b71a027cf2432f53faba087a449 Mon Sep 17 00:00:00 2001 From: Ali Asadi Date: Tue, 18 Aug 2026 10:48:36 +0330 Subject: [PATCH] Add explicit schema types for presigned media URL fields Swagger inferred these SerializerMethodFields as untyped strings and warned on generation; annotate each with @extend_schema_field so the generated OpenAPI schema declares them as nullable URLs. --- apps/catalog/serializers.py | 4 ++++ apps/stores/serializers.py | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/apps/catalog/serializers.py b/apps/catalog/serializers.py index 160f2be..2349b75 100644 --- a/apps/catalog/serializers.py +++ b/apps/catalog/serializers.py @@ -1,3 +1,4 @@ +from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from apps.core.media import presigned_media_url @@ -13,6 +14,7 @@ class ProductCategorySerializer(serializers.ModelSerializer): model = ProductCategory fields = ('uuid', 'name', 'parent', 'icon', 'icon_url', 'order') + @extend_schema_field(serializers.URLField(allow_null=True)) def get_icon_url(self, obj): return presigned_media_url(obj.icon) @@ -28,6 +30,7 @@ class ProductListSerializer(serializers.ModelSerializer): 'is_active', 'is_out_of_stock', ) + @extend_schema_field(serializers.URLField(allow_null=True)) def get_image_url(self, obj): return presigned_media_url(obj.image) @@ -60,6 +63,7 @@ class SellerProductSerializer(serializers.ModelSerializer): ) read_only_fields = ('sold_count',) + @extend_schema_field(serializers.URLField(allow_null=True)) def get_image_url(self, obj): return presigned_media_url(obj.image) diff --git a/apps/stores/serializers.py b/apps/stores/serializers.py index f3f7bef..262fde7 100644 --- a/apps/stores/serializers.py +++ b/apps/stores/serializers.py @@ -1,4 +1,5 @@ from django.contrib.gis.geos import Point +from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from apps.core.media import presigned_media_url @@ -15,6 +16,7 @@ class StoreCategorySerializer(serializers.ModelSerializer): model = StoreCategory fields = ('uuid', 'name', 'icon', 'icon_url', 'order') + @extend_schema_field(serializers.URLField(allow_null=True)) def get_icon_url(self, obj): return presigned_media_url(obj.icon) @@ -38,9 +40,11 @@ class StoreListSerializer(serializers.ModelSerializer): 'free_delivery_threshold', 'is_open', ) + @extend_schema_field(serializers.URLField(allow_null=True)) def get_logo_url(self, obj): return presigned_media_url(obj.logo) + @extend_schema_field(serializers.URLField(allow_null=True)) def get_cover_image_url(self, obj): return presigned_media_url(obj.cover_image) @@ -117,9 +121,11 @@ class SellerStoreSerializer(serializers.ModelSerializer): ) read_only_fields = ('rating_avg', 'rating_count', 'status') + @extend_schema_field(serializers.URLField(allow_null=True)) def get_logo_url(self, obj): return presigned_media_url(obj.logo) + @extend_schema_field(serializers.URLField(allow_null=True)) def get_cover_image_url(self, obj): return presigned_media_url(obj.cover_image)