Browse Source

feat(hadis): include rich references in HadisListSerializer and optimize prefetching

master
Mohsen Taba 4 days ago
parent
commit
ce99524640
  1. 10
      apps/hadis/models/hadis.py
  2. 7
      apps/hadis/serializers/hadis.py
  3. 22
      apps/hadis/views/hadis.py

10
apps/hadis/models/hadis.py

@ -184,7 +184,15 @@ class Hadis(LowercaseSlugMixin, models.Model):
embedded_in = models.JSONField(default=list, blank=True) embedded_in = models.JSONField(default=list, blank=True)
def __str__(self): 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}" return f"{self.number} - {title}"
def clean(self): def clean(self):

7
apps/hadis/serializers/hadis.py

@ -324,6 +324,7 @@ class HadisListSerializer(serializers.ModelSerializer):
title_narrator = LocalizedField() title_narrator = LocalizedField()
address = serializers.SerializerMethodField() address = serializers.SerializerMethodField()
links = serializers.SerializerMethodField() links = serializers.SerializerMethodField()
references = serializers.SerializerMethodField()
reference_images = serializers.SerializerMethodField() reference_images = serializers.SerializerMethodField()
images = serializers.SerializerMethodField() images = serializers.SerializerMethodField()
@ -331,7 +332,11 @@ class HadisListSerializer(serializers.ModelSerializer):
model = Hadis model = Hadis
fields = ['id', 'number', 'slug', 'title', 'title_narrator', 'text', fields = ['id', 'number', 'slug', 'title', 'title_narrator', 'text',
'translation', 'category', 'status', 'bookmark', 'share_link', '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): def get_address(self, obj):
formatted = format_address_output(obj.address) formatted = format_address_output(obj.address)

22
apps/hadis/views/hadis.py

@ -345,8 +345,15 @@ class HadisListView(ListAPIView):
'tags', 'tags',
Prefetch( Prefetch(
'references', '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( queryset = Hadis.objects.select_related('category__sect', 'hadis_status').prefetch_related(
Prefetch( Prefetch(
'references', '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'
) )
) )
) )

Loading…
Cancel
Save