Browse Source

fix(hadis): paginate book editions endpoint and remove N+1 queries

- Use OptionalPagination on AdminBookEditionViewSet (page/page_size), keep full list when not requested
- Extend edition search to title, publisher, year and connected book titles
- Add select_related/prefetch_related and use prefetched data in AdminBookEditionSerializer (54 -> 6 queries per page)
- Add books_detail field; fix editors update logic being nested under wrong condition
- Fallback book_reference to first connected book when missing
master
Mohsen Taba 1 week ago
parent
commit
d7d0c0093f
  1. 7920
      apps/hadis/serializers/serializers_admin.py
  2. 18
      apps/hadis/views_admin.py

7920
apps/hadis/serializers/serializers_admin.py
File diff suppressed because it is too large
View File

18
apps/hadis/views_admin.py

@ -2565,13 +2565,19 @@ class AdminBookEditionViewSet(ModelViewSet):
serializer_class = AdminBookEditionSerializer
pagination_class = None
pagination_class = OptionalPagination
def get_queryset(self):
queryset = BookEdition.objects.all().prefetch_related("books", "volumes")
queryset = BookEdition.objects.all().select_related(
"tag",
"publisher_item__city__country",
"publisher_item__country",
"city_of_publication_city__country",
"country_of_publication_country",
).prefetch_related("books", "volumes", "researchers", "editors")
book_reference_id = self.request.query_params.get("book_reference_id")
@ -2583,9 +2589,13 @@ class AdminBookEditionViewSet(ModelViewSet):
if search_query:
from django.db.models import Q
queryset = queryset.filter(
Q(title__icontains=search_query) |
Q(edition_number__icontains=search_query) |
Q(isbn__icontains=search_query)
)
Q(publisher__icontains=search_query) |
Q(year_of_publication__icontains=search_query) |
Q(isbn__icontains=search_query) |
Q(books__title__icontains=search_query)
).distinct()
return queryset.order_by("-created_at")

Loading…
Cancel
Save