diff --git a/apps/hadis/serializers/serializers_admin.py b/apps/hadis/serializers/serializers_admin.py index c5d7326..e541ac0 100644 --- a/apps/hadis/serializers/serializers_admin.py +++ b/apps/hadis/serializers/serializers_admin.py @@ -230,10 +230,23 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): return hadis -class AdminHadisCorrectionSerializer(serializers.ModelSerializer): - hadis_detail = AdminHadisListSerializer(source="hadis", read_only=True) +class AdminHadisBriefSerializer(serializers.ModelSerializer): + class Meta: + model = Hadis + fields = ["id", "number", "title"] - bookmark_count = serializers.SerializerMethodField() + +class AdminHadisCategoryBriefSerializer(serializers.ModelSerializer): + title = LocalizedField() + + class Meta: + model = HadisCategory + fields = ["id", "title"] + + +class AdminHadisCorrectionSerializer(serializers.ModelSerializer): + hadis_detail = AdminHadisBriefSerializer(source="hadis", read_only=True) + bookmark_count = serializers.IntegerField(source="annotated_bookmark_count", read_only=True) class Meta: model = HadisCorrection @@ -252,13 +265,9 @@ class AdminHadisCorrectionSerializer(serializers.ModelSerializer): ] read_only_fields = ["id", "slug", "bookmark_count", "created_at", "updated_at"] - def get_bookmark_count(self, obj): - from apps.bookmark.models.bookmark import Bookmark - return Bookmark.objects.filter(service=Bookmark.ServiceChoices.HADITH_CORRECTION, content_id=obj.id, status=True).count() - class AdminHadisInterpretationSerializer(serializers.ModelSerializer): - category_detail = AdminHadisCategorySerializer(source="category", read_only=True) + category_detail = AdminHadisCategoryBriefSerializer(source="category", read_only=True) class Meta: model = HadisInterpretation diff --git a/apps/hadis/views_admin.py b/apps/hadis/views_admin.py index 0e0eefb..1b335d7 100644 --- a/apps/hadis/views_admin.py +++ b/apps/hadis/views_admin.py @@ -319,7 +319,19 @@ class AdminHadisCorrectionViewSet(ModelViewSet): pagination_class = None def get_queryset(self): - queryset = HadisCorrection.objects.all() + from django.db.models import Count, OuterRef, Subquery, IntegerField + from django.db.models.functions import Coalesce + from apps.bookmark.models.bookmark import Bookmark + + bookmarks_subquery = Bookmark.objects.filter( + service=Bookmark.ServiceChoices.HADITH_CORRECTION, + content_id=OuterRef("id"), + status=True + ).values("content_id").annotate(count=Count("id")).values("count") + + queryset = HadisCorrection.objects.all().select_related("hadis").annotate( + annotated_bookmark_count=Coalesce(Subquery(bookmarks_subquery, output_field=IntegerField()), 0) + ) hadis_id = self.request.query_params.get("hadis_id") if hadis_id: queryset = queryset.filter(hadis_id=hadis_id) @@ -353,7 +365,7 @@ class AdminHadisInterpretationViewSet(ModelViewSet): pagination_class = None def get_queryset(self): - queryset = HadisInterpretation.objects.all() + queryset = HadisInterpretation.objects.all().select_related("category") category_id = self.request.query_params.get("category_id") if category_id: queryset = queryset.filter(category_id=category_id)