欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

django实现一个对自关联评论表的无限极评论封装

程序员文章站 2022-05-31 09:19:07
...

给定一个课程的id 返回课程下的评论(无限极)

class Coouser_Comments_View(APIView):

    def get(self,reqeust):
		course_id = reqeust.GET.get('course_id')
        course_comments = CourseComments.objects.filter(course_id=course_id)

        data = CourseComments_Ser(course_comments, many=True).data
        list = []  # 最后的结果存放在这里
        tree = {}  # 相当于是承接的部分
        root = ''
        p_id = ''
        # 封装了tree
        for i in data:
            user = User.objects.filter(id=i['user_id']).first()
            ser = UserSer(user).data
            # 将data循环,然后加入一个dict中,key为每条数据的ID,val对应为整条数据
            i['user_id'] = ser

            tree[i["id"]] = i
            # {  1:{id:1},  2:{id:2},  3:{id:3}  }
            # print(tree)

        for i in data:
            # p_id==0,他就是祖先
            if i["parent_id"] == 0:
                # root = tree[i]  #i.di为tree里的key,将key对应的val取出
                list.append(i)
            else:
                p_id = i["parent_id"]  # 1
                # 判断父级是否有孩子字段(childlist),如果有将当前数据加入,如果没有添加(childlist)后再加入
                if "childlist" not in tree[p_id]:
                    tree[p_id]['childlist'] = []
                # 加入父级用户的记录
                user2 = User.objects.filter(id=tree[p_id]['user_id']['id']).first()
                ser2 = UserSer(user2).data
                i['p'] = ser2
                tree[p_id]["childlist"].append(i)
        resp = {}
        resp['data'] = list

        return Response(resp)

加到list中的都是父级评论,为什么父级评论的childlist里面会有他相应的子评论?

你可以先往深了想父级评论的childlist里有他的子评论,他的子评论的childlist里有他的子评论

禁止套娃(滑稽)其实是因为循环里的每一步修改都是将自己本身加入到了父评论的childlist中,然后父评论发生改变, 父级评论的父级评论发生改变,就很像递归哈哈哈 其实打印一下tree你就大概知道原理了