Browse Source

query optimization for corrections and interpretation

master
Mohsen Taba 2 weeks ago
parent
commit
2938e67db1
  1. 25
      apps/hadis/serializers/serializers_admin.py
  2. 16
      apps/hadis/views_admin.py

25
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

16
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)

Loading…
Cancel
Save