diff --git a/apps/hadis/migrations/0019_bookauthor_related_narrator.py b/apps/hadis/migrations/0019_bookauthor_related_narrator.py new file mode 100644 index 0000000..8a3f2be --- /dev/null +++ b/apps/hadis/migrations/0019_bookauthor_related_narrator.py @@ -0,0 +1,19 @@ +# Generated by Django 5.2.12 on 2026-06-22 08:41 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('hadis', '0018_bookauthor_features_bookauthor_known_as_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='bookauthor', + name='related_narrator', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='book_author_profile', to='hadis.transmitters', verbose_name='Related Narrator Profile'), + ), + ] diff --git a/apps/hadis/models/reference.py b/apps/hadis/models/reference.py index db65997..43f6a48 100644 --- a/apps/hadis/models/reference.py +++ b/apps/hadis/models/reference.py @@ -356,6 +356,15 @@ class BookAuthor(models.Model): """ name = models.JSONField(default=list, verbose_name=_('Name')) slug = models.SlugField(max_length=255, verbose_name=_('slug'), null=True, blank=True, unique=True) + + related_narrator = models.OneToOneField( + 'hadis.Transmitters', + on_delete=models.SET_NULL, + null=True, + blank=True, + related_name='book_author_profile', + verbose_name=_('Related Narrator Profile') + ) # 👇 فیلدهای جدید اضافه شده known_as = models.JSONField(default=list, blank=True, verbose_name=_('Known as')) diff --git a/apps/hadis/serializers/reference_v2.py b/apps/hadis/serializers/reference_v2.py index 427903c..1e0d990 100644 --- a/apps/hadis/serializers/reference_v2.py +++ b/apps/hadis/serializers/reference_v2.py @@ -204,6 +204,7 @@ class BookAuthorDetailSerializer(serializers.ModelSerializer): tabaqa = LocalizedField() rutba = LocalizedField() features = LocalizedField() + related_narrator_slug = serializers.CharField(source='related_narrator.slug', read_only=True, allow_null=True) class Meta: model = BookAuthor @@ -211,7 +212,8 @@ class BookAuthorDetailSerializer(serializers.ModelSerializer): 'id', 'slug', 'name', 'known_as', 'scholarity', 'tabaqa', 'rutba', 'features', 'birth_year_hijri', 'death_year_hijri', - 'birth_year_miladi', 'death_year_miladi' + 'birth_year_miladi', 'death_year_miladi', + 'related_narrator_slug' ] @@ -259,6 +261,7 @@ class BookAuthorSyncSerializer(serializers.ModelSerializer): tabaqa = LocalizedField() rutba = LocalizedField() features = LocalizedField() + related_narrator_slug = serializers.CharField(source='related_narrator.slug', read_only=True, allow_null=True) # اضافه کردن لیست کتاب‌ها books = BookAuthorSyncReferenceSerializer(source='book_references', many=True, read_only=True) @@ -278,5 +281,6 @@ class BookAuthorSyncSerializer(serializers.ModelSerializer): 'death_year_hijri', 'birth_year_miladi', 'death_year_miladi', - 'books' # 👈 لیست کتاب‌های هر نویسنده + 'books', # 👈 لیست کتاب‌های هر نویسنده + 'related_narrator_slug' ] \ No newline at end of file diff --git a/apps/hadis/views/reference_v2.py b/apps/hadis/views/reference_v2.py index ee5a382..f08292d 100644 --- a/apps/hadis/views/reference_v2.py +++ b/apps/hadis/views/reference_v2.py @@ -226,7 +226,7 @@ class BookAuthorDetailView(RetrieveAPIView): """ دریافت اطلاعات دقیق یک نویسنده بر اساس slug """ - queryset = BookAuthor.objects.all() + queryset = BookAuthor.objects.select_related('related_narrator').all() serializer_class = BookAuthorDetailSerializer lookup_field = 'slug' lookup_url_kwarg = 'author_slug' @@ -255,7 +255,7 @@ class BookAuthorSyncView(generics.ListAPIView): Returns complete author data and their associated books without pagination. """ # 👇 استفاده از prefetch_related برای جلوگیری از کرش کردن دیتابیس به خاطر N+1 Query - queryset = BookAuthor.objects.prefetch_related('book_references').order_by('id') + queryset = BookAuthor.objects.select_related('related_narrator').prefetch_related('book_references').order_by('id') serializer_class = BookAuthorSyncSerializer pagination_class = NoPagination permission_classes = [AllowAny]