From ce99524640c8ffc83af90c14c411c4826b53165d Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Tue, 6 Oct 2026 15:28:07 +0330 Subject: [PATCH] feat(hadis): include rich references in HadisListSerializer and optimize prefetching --- apps/hadis/models/hadis.py | 10 +++++++++- apps/hadis/serializers/hadis.py | 7 ++++++- apps/hadis/views/hadis.py | 22 ++++++++++++++++++---- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/apps/hadis/models/hadis.py b/apps/hadis/models/hadis.py index b9a93a8..7407bc2 100644 --- a/apps/hadis/models/hadis.py +++ b/apps/hadis/models/hadis.py @@ -184,7 +184,15 @@ class Hadis(LowercaseSlugMixin, models.Model): embedded_in = models.JSONField(default=list, blank=True) def __str__(self): - title = self.title[0]['text'] if self.title else f"Hadis {self.number}" + title = None + if self.title: + first_item = self.title[0] if isinstance(self.title, list) and self.title else self.title + if isinstance(first_item, dict): + title = first_item.get('text') or first_item.get('value') or first_item.get('title') + elif isinstance(first_item, str): + title = first_item + if not title: + title = f"Hadis {self.number}" return f"{self.number} - {title}" def clean(self): diff --git a/apps/hadis/serializers/hadis.py b/apps/hadis/serializers/hadis.py index 5428a64..cc9b8d0 100644 --- a/apps/hadis/serializers/hadis.py +++ b/apps/hadis/serializers/hadis.py @@ -324,6 +324,7 @@ class HadisListSerializer(serializers.ModelSerializer): title_narrator = LocalizedField() address = serializers.SerializerMethodField() links = serializers.SerializerMethodField() + references = serializers.SerializerMethodField() reference_images = serializers.SerializerMethodField() images = serializers.SerializerMethodField() @@ -331,7 +332,11 @@ class HadisListSerializer(serializers.ModelSerializer): model = Hadis fields = ['id', 'number', 'slug', 'title', 'title_narrator', 'text', 'translation', 'category', 'status', 'bookmark', 'share_link', - 'address', 'links', 'reference_images', 'images', 'tags'] + 'address', 'links', 'references', 'reference_images', 'images', 'tags'] + + def get_references(self, obj): + refs = obj.references.all() + return DetailedHadisReferenceSerializer(refs, many=True, context=self.context).data def get_address(self, obj): formatted = format_address_output(obj.address) diff --git a/apps/hadis/views/hadis.py b/apps/hadis/views/hadis.py index 7f83365..9233c9f 100644 --- a/apps/hadis/views/hadis.py +++ b/apps/hadis/views/hadis.py @@ -345,8 +345,15 @@ class HadisListView(ListAPIView): 'tags', Prefetch( 'references', - queryset=HadisReference.objects.prefetch_related( - Prefetch('images', queryset=ReferenceImage.objects.order_by('priority')) + queryset=HadisReference.objects.select_related( + 'book_reference', + 'book_reference__author', + 'edition', + 'book_volume', + 'book_volume__edition' + ).prefetch_related( + Prefetch('images', queryset=ReferenceImage.objects.order_by('priority')), + 'book_reference__editions' ) ) ) @@ -456,8 +463,15 @@ class HadisMainListView(ListAPIView): queryset = Hadis.objects.select_related('category__sect', 'hadis_status').prefetch_related( Prefetch( 'references', - queryset=HadisReference.objects.select_related('book_reference__author').prefetch_related( - Prefetch('images', queryset=ReferenceImage.objects.order_by('priority')) + queryset=HadisReference.objects.select_related( + 'book_reference', + 'book_reference__author', + 'edition', + 'book_volume', + 'book_volume__edition' + ).prefetch_related( + Prefetch('images', queryset=ReferenceImage.objects.order_by('priority')), + 'book_reference__editions' ) ) )