From cccced1938f1e63179e5bf8355693b9ffbaccae2 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Sat, 21 Feb 2026 10:33:53 +0330 Subject: [PATCH] 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. --- apps/article/serializers.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/apps/article/serializers.py b/apps/article/serializers.py index 4068e61..b5d7540 100644 --- a/apps/article/serializers.py +++ b/apps/article/serializers.py @@ -72,6 +72,19 @@ class ArticleContentSerializer(serializers.ModelSerializer): model = ArticleContent 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): categories = ArticleCategoryListSerializer(many=True, read_only=True) thumbnail = serializers.SerializerMethodField() @@ -80,12 +93,14 @@ class ArticleDetailSerializer(serializers.ModelSerializer): average_rate = serializers.SerializerMethodField() article_content = serializers.SerializerMethodField() share_link = serializers.CharField(read_only=True) + similar_articles = serializers.SerializerMethodField() class Meta: model = Article fields = ['id', 'title', 'slug', 'thumbnail', 'description', '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): return get_thumbs(obj.thumbnail, self.context.get('request')) @@ -141,6 +156,17 @@ class ArticleDetailSerializer(serializers.ModelSerializer): 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): """ Get the content of the article.