You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django递归评论序列化器问题:如何展示全部递归评论?

Django递归评论序列化问题解决方案

问题描述

我基于Django开发,现有如下Comments模型代码:

class Comments(models.Model):
    content = models.CharField(max_length=500)
    sub_comment_id = models.ForeignKey('self', related_name='sub_comments', null=True, blank=True,
                                       on_delete=models.CASCADE)

    author_id = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='user_comments', on_delete=models.CASCADE)
    article_id = models.ForeignKey(Article, related_name='article_comments', on_delete=models.CASCADE)

    like = models.IntegerField(default=0)
    dislike = models.IntegerField(default=0)

    is_sub = models.BooleanField(default=False)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = models.Manager()

    def __str__(self):
        return self.content

希望在Comment Serializer中展示所有递归评论,尝试使用django rest framework-recursive但未生效,请问该如何解决?

解决方案

1. 确认依赖安装与版本兼容

先确保已正确安装依赖:

pip install djangorestframework-recursive

注意检查DRF版本与该库的兼容性,建议使用双方的最新稳定版。

2. 正确配置递归Serializer

使用RecursiveField实现嵌套序列化,同时确保字段名与模型的related_name匹配:

from rest_framework import serializers
from rest_framework_recursive.fields import RecursiveField
from .models import Comments

class CommentSerializer(serializers.ModelSerializer):
    # 利用RecursiveField递归序列化子评论,many=True表示支持多条子评论
    sub_comments = RecursiveField(many=True, read_only=True)

    class Meta:
        model = Comments
        fields = ['id', 'content', 'author_id', 'article_id', 'like', 'dislike', 'created_at', 'updated_at', 'sub_comments']

3. 视图层返回顶级评论

在视图中仅查询无父级的顶级评论,避免重复嵌套或无效数据:

from rest_framework import generics
from .models import Comments
from .serializers import CommentSerializer

class ArticleCommentListAPIView(generics.ListAPIView):
    serializer_class = CommentSerializer

    def get_queryset(self):
        # 筛选指定文章的顶级评论(sub_comment_id为空)
        article_id = self.kwargs.get('article_id')
        return Comments.objects.filter(
            article_id=article_id,
            sub_comment_id__isnull=True
        ).order_by('-created_at')

4. 模型优化(可选)

模型中的is_sub字段属于冗余字段,可直接通过sub_comment_id__isnull判断是否为子评论,建议删除该字段以简化逻辑。

常见排查点

  • 检查模型中sub_comment_id的related_name是否为sub_comments,Serializer中必须使用该字段名关联子评论,不能写错。
  • 确保查询集仅返回顶级评论,若返回所有评论会导致嵌套混乱。
  • 检查DRF权限配置,确保子评论的字段有权限被序列化输出。

内容的提问来源于stack exchange,提问作者hexal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:35:20