diff --git a/core/apps/api/serializers/ad/home_api.py b/core/apps/api/serializers/ad/home_api.py index 67f7ba3..d709984 100644 --- a/core/apps/api/serializers/ad/home_api.py +++ b/core/apps/api/serializers/ad/home_api.py @@ -16,9 +16,10 @@ class AdVariantSerializer(serializers.ModelSerializer): class BaseHomeAdSerializer(serializers.ModelSerializer): - variants = serializers.SerializerMethodField() star = serializers.SerializerMethodField() comment_count = serializers.SerializerMethodField() + price = serializers.SerializerMethodField() + discount = serializers.SerializerMethodField() class Meta: model = AdModel @@ -29,14 +30,25 @@ class BaseHomeAdSerializer(serializers.ModelSerializer): "image", "star", "comment_count", - "variants", + "discount", ] - def get_variants(self, obj): - variant = obj.variants.order_by("price").first() - if variant: - return AdVariantSerializer(variant).data - return [] + def _get_first_variant(self, obj): + if not hasattr(self, "_variant_cache"): + self._variant_cache = {} + if obj.id not in self._variant_cache: + self._variant_cache[obj.id] = obj.variants.order_by("price").first() + return self._variant_cache[obj.id] + + def get_price(self, obj): + variant = self._get_first_variant(obj) + if not variant: + return obj.price + return variant.price if variant else 0 + + def get_discount(self, obj): + variant = self._get_first_variant(obj) + return variant.discount if variant else 0 def get_star(self, obj): avg = obj.feedback.aggregate(avg=Avg("star"))["avg"]