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.