Browse Source

refrence author and transmitters models are related to eachother

master
Mohsen Taba 4 weeks ago
parent
commit
631c96ef13
  1. 19
      apps/hadis/migrations/0019_bookauthor_related_narrator.py
  2. 9
      apps/hadis/models/reference.py
  3. 8
      apps/hadis/serializers/reference_v2.py
  4. 4
      apps/hadis/views/reference_v2.py

19
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'),
),
]

9
apps/hadis/models/reference.py

@ -356,6 +356,15 @@ class BookAuthor(models.Model):
""" """
name = models.JSONField(default=list, verbose_name=_('Name')) name = models.JSONField(default=list, verbose_name=_('Name'))
slug = models.SlugField(max_length=255, verbose_name=_('slug'), null=True, blank=True, unique=True) 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')) known_as = models.JSONField(default=list, blank=True, verbose_name=_('Known as'))

8
apps/hadis/serializers/reference_v2.py

@ -204,6 +204,7 @@ class BookAuthorDetailSerializer(serializers.ModelSerializer):
tabaqa = LocalizedField() tabaqa = LocalizedField()
rutba = LocalizedField() rutba = LocalizedField()
features = LocalizedField() features = LocalizedField()
related_narrator_slug = serializers.CharField(source='related_narrator.slug', read_only=True, allow_null=True)
class Meta: class Meta:
model = BookAuthor model = BookAuthor
@ -211,7 +212,8 @@ class BookAuthorDetailSerializer(serializers.ModelSerializer):
'id', 'slug', 'name', 'known_as', 'scholarity', 'id', 'slug', 'name', 'known_as', 'scholarity',
'tabaqa', 'rutba', 'features', 'tabaqa', 'rutba', 'features',
'birth_year_hijri', 'death_year_hijri', '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() tabaqa = LocalizedField()
rutba = LocalizedField() rutba = LocalizedField()
features = 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) books = BookAuthorSyncReferenceSerializer(source='book_references', many=True, read_only=True)
@ -278,5 +281,6 @@ class BookAuthorSyncSerializer(serializers.ModelSerializer):
'death_year_hijri', 'death_year_hijri',
'birth_year_miladi', 'birth_year_miladi',
'death_year_miladi', 'death_year_miladi',
'books' # 👈 لیست کتاب‌های هر نویسنده
'books', # 👈 لیست کتاب‌های هر نویسنده
'related_narrator_slug'
] ]

4
apps/hadis/views/reference_v2.py

@ -226,7 +226,7 @@ class BookAuthorDetailView(RetrieveAPIView):
""" """
دریافت اطلاعات دقیق یک نویسنده بر اساس slug دریافت اطلاعات دقیق یک نویسنده بر اساس slug
""" """
queryset = BookAuthor.objects.all()
queryset = BookAuthor.objects.select_related('related_narrator').all()
serializer_class = BookAuthorDetailSerializer serializer_class = BookAuthorDetailSerializer
lookup_field = 'slug' lookup_field = 'slug'
lookup_url_kwarg = 'author_slug' lookup_url_kwarg = 'author_slug'
@ -255,7 +255,7 @@ class BookAuthorSyncView(generics.ListAPIView):
Returns complete author data and their associated books without pagination. Returns complete author data and their associated books without pagination.
""" """
# 👇 استفاده از prefetch_related برای جلوگیری از کرش کردن دیتابیس به خاطر N+1 Query # 👇 استفاده از 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 serializer_class = BookAuthorSyncSerializer
pagination_class = NoPagination pagination_class = NoPagination
permission_classes = [AllowAny] permission_classes = [AllowAny]

Loading…
Cancel
Save