Browse Source

Add SimilarArticleSerializer and enhance ArticleDetailSerializer with similar articles feature

- Introduced `SimilarArticleSerializer` to provide a structured representation of similar articles, including categories and thumbnail.
- Updated `ArticleDetailSerializer` to include a new `similar_articles` field, which fetches articles from the same categories, excluding the current article.
- Implemented a method to retrieve similar articles, improving the article detail view with relevant content suggestions.
master
Mohsen Taba 3 months ago
parent
commit
cccced1938
  1. 28
      apps/article/serializers.py

28
apps/article/serializers.py

@ -72,6 +72,19 @@ class ArticleContentSerializer(serializers.ModelSerializer):
model = ArticleContent model = ArticleContent
fields = ['id', 'title', 'content', 'priority', 'status', 'created_at', 'updated_at', 'parts'] fields = ['id', 'title', 'content', 'priority', 'status', 'created_at', 'updated_at', 'parts']
class SimilarArticleSerializer(serializers.ModelSerializer):
categories = ArticleCategoryListSerializer(many=True, read_only=True)
thumbnail = serializers.SerializerMethodField()
share_link = serializers.CharField(read_only=True)
class Meta:
model = Article
fields = ['title', 'slug', 'thumbnail', 'categories', 'share_link', 'created_at']
def get_thumbnail(self, obj):
return get_thumbs(obj.thumbnail, self.context.get('request'))
class ArticleDetailSerializer(serializers.ModelSerializer): class ArticleDetailSerializer(serializers.ModelSerializer):
categories = ArticleCategoryListSerializer(many=True, read_only=True) categories = ArticleCategoryListSerializer(many=True, read_only=True)
thumbnail = serializers.SerializerMethodField() thumbnail = serializers.SerializerMethodField()
@ -80,12 +93,14 @@ class ArticleDetailSerializer(serializers.ModelSerializer):
average_rate = serializers.SerializerMethodField() average_rate = serializers.SerializerMethodField()
article_content = serializers.SerializerMethodField() article_content = serializers.SerializerMethodField()
share_link = serializers.CharField(read_only=True) share_link = serializers.CharField(read_only=True)
similar_articles = serializers.SerializerMethodField()
class Meta: class Meta:
model = Article model = Article
fields = ['id', 'title', 'slug', 'thumbnail', 'description', fields = ['id', 'title', 'slug', 'thumbnail', 'description',
'article_file', 'view_count', 'download_count', 'article_file', 'view_count', 'download_count',
'categories', 'created_at', 'user_rate', 'average_rate', 'bookmark', 'article_content', 'share_link']
'categories', 'created_at', 'user_rate', 'average_rate', 'bookmark', 'article_content', 'share_link',
'similar_articles']
def get_thumbnail(self, obj): def get_thumbnail(self, obj):
return get_thumbs(obj.thumbnail, self.context.get('request')) return get_thumbs(obj.thumbnail, self.context.get('request'))
@ -141,6 +156,17 @@ class ArticleDetailSerializer(serializers.ModelSerializer):
content_id=obj.id content_id=obj.id
) )
def get_similar_articles(self, obj):
category_ids = obj.categories.values_list('id', flat=True)
similar = (
Article.objects
.filter(categories__id__in=category_ids, status=True)
.exclude(id=obj.id)
.distinct()
.order_by('-created_at')[:3]
)
return SimilarArticleSerializer(similar, many=True, context=self.context).data
def get_article_content(self, obj): def get_article_content(self, obj):
""" """
Get the content of the article. Get the content of the article.

Loading…
Cancel
Save