Browse Source

feat(hadis): add hadis_ids to pinned and middle collection serializers with prefetch optimization

master
Mohsen Taba 2 weeks ago
parent
commit
ee33545d58
  1. 34
      apps/hadis/serializers/hadis.py
  2. 14
      apps/hadis/views/hadis.py

34
apps/hadis/serializers/hadis.py

@ -49,11 +49,12 @@ class PinnedHadisCollectionSerializer(serializers.ModelSerializer):
title = LocalizedField() title = LocalizedField()
summary = LocalizedField() summary = LocalizedField()
thumbnail = serializers.SerializerMethodField() thumbnail = serializers.SerializerMethodField()
hadis_ids = serializers.SerializerMethodField()
class Meta: class Meta:
model = HadisCollection model = HadisCollection
# فیلدهایی که برای نمایش در بخش پین شده (مثل اسلایدر یا لیست بالا) نیاز هست # فیلدهایی که برای نمایش در بخش پین شده (مثل اسلایدر یا لیست بالا) نیاز هست
fields = ['id', 'title', 'slug', 'summary', 'thumbnail', 'order', 'created_at']
fields = ['id', 'title', 'slug', 'summary', 'thumbnail', 'order', 'created_at', 'hadis_ids']
def get_thumbnail(self, obj): def get_thumbnail(self, obj):
if obj.thumbnail: if obj.thumbnail:
@ -63,14 +64,29 @@ class PinnedHadisCollectionSerializer(serializers.ModelSerializer):
return absolute_https_url(obj.thumbnail.url) return absolute_https_url(obj.thumbnail.url)
return None return None
def get_hadis_ids(self, obj):
# دریافت شناسه احادیث فعال متعلق به این کالکشن به ترتیب
if hasattr(obj, '_prefetched_objects_cache') and 'hadis_items' in obj._prefetched_objects_cache:
items = [
item.hadis_id for item in obj.hadis_items.all()
if getattr(getattr(item, 'hadis', None), 'status', True)
]
return items
return list(
obj.hadis_items.filter(hadis__status=True)
.order_by('order')
.values_list('hadis_id', flat=True)
)
class HadisCollectionListSerializer(serializers.ModelSerializer): class HadisCollectionListSerializer(serializers.ModelSerializer):
thumbnail = serializers.SerializerMethodField() thumbnail = serializers.SerializerMethodField()
title = LocalizedField() title = LocalizedField()
summary = LocalizedField() summary = LocalizedField()
hadis_ids = serializers.SerializerMethodField()
class Meta: class Meta:
model = HadisCollection model = HadisCollection
fields = ['id', 'title', 'summary','slug', 'thumbnail']
fields = ['id', 'title', 'summary', 'slug', 'thumbnail', 'hadis_ids']
def get_thumbnail(self, obj): def get_thumbnail(self, obj):
if obj.thumbnail: if obj.thumbnail:
@ -80,6 +96,20 @@ class HadisCollectionListSerializer(serializers.ModelSerializer):
return absolute_https_url(obj.thumbnail.url) return absolute_https_url(obj.thumbnail.url)
return None return None
def get_hadis_ids(self, obj):
# دریافت شناسه احادیث فعال متعلق به این کالکشن به ترتیب
if hasattr(obj, '_prefetched_objects_cache') and 'hadis_items' in obj._prefetched_objects_cache:
items = [
item.hadis_id for item in obj.hadis_items.all()
if getattr(getattr(item, 'hadis', None), 'status', True)
]
return items
return list(
obj.hadis_items.filter(hadis__status=True)
.order_by('order')
.values_list('hadis_id', flat=True)
)
class HadisSyncSerializer(serializers.ModelSerializer): class HadisSyncSerializer(serializers.ModelSerializer):
"""Serializer for syncing all hadis data (grouped fields)""" """Serializer for syncing all hadis data (grouped fields)"""

14
apps/hadis/views/hadis.py

@ -33,10 +33,17 @@ class PinnedHadisCollectionListView(ListAPIView):
return self.list(request, *args, **kwargs) return self.list(request, *args, **kwargs)
def get_queryset(self): def get_queryset(self):
from django.db.models import Prefetch
from apps.hadis.models import HadisInCollection
return HadisCollection.objects.filter( return HadisCollection.objects.filter(
status=True, status=True,
display_position=HadisCollection.DisplayPosition.PINNED, display_position=HadisCollection.DisplayPosition.PINNED,
hadis_items__hadis__status=True hadis_items__hadis__status=True
).prefetch_related(
Prefetch(
'hadis_items',
queryset=HadisInCollection.objects.filter(hadis__status=True).order_by('order')
)
).distinct().order_by('order', '-created_at') ).distinct().order_by('order', '-created_at')
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
@ -100,9 +107,16 @@ class HadisCollectionListView(ListAPIView):
return self.list(request, *args, **kwargs) return self.list(request, *args, **kwargs)
def get_queryset(self): def get_queryset(self):
from django.db.models import Prefetch
from apps.hadis.models import HadisInCollection
return HadisCollection.objects.filter( return HadisCollection.objects.filter(
status=True, status=True,
display_position=HadisCollection.DisplayPosition.MIDDLE display_position=HadisCollection.DisplayPosition.MIDDLE
).prefetch_related(
Prefetch(
'hadis_items',
queryset=HadisInCollection.objects.filter(hadis__status=True).order_by('order')
)
).order_by('order', '-created_at') ).order_by('order', '-created_at')

Loading…
Cancel
Save