美文网首页
无限评论树状结构序列化构建

无限评论树状结构序列化构建

作者: mutang | 来源:发表于2021-10-04 17:45 被阅读0次
# 模型类
from __future__ import unicode_literals
import uuid

from django.utils.encoding import python_2_unicode_compatible
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey
from django.db import models


@python_2_unicode_compatible
class Comment(models.Model):
    """使用Django中的ContentType, 同时关联用户对模型的投票"""
    uuid_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    content = models.CharField(max_length=255, verbose_name="评论内容")
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, related_name="commentator", on_delete=models.SET_NULL,
                             verbose_name='评论者')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    """多级评论需要 自关联"""
    root = models.ForeignKey('self', models.SET_NULL, null=True, blank=True, related_name='root_comment',
                             verbose_name='根评论')
    parent = models.ForeignKey("self", models.SET_NULL, related_name="parent_comment", null=True, blank=True,
                               verbose_name='上级评论')
    reply_to = models.ForeignKey(settings.AUTH_USER_MODEL, models.SET_DEFAULT, default=1, null=True, blank=True,
                                 related_name='replier', verbose_name='被回复者')
    content_type = models.ForeignKey(ContentType, related_name='comment_on', on_delete=models.CASCADE)
    object_id = models.CharField(max_length=255)
    comment = GenericForeignKey()  # 等同于GenericForeignKey()

    class Meta:
        verbose_name = "评论"
        verbose_name_plural = verbose_name
        ordering = ['-created_at']  # 指明默认排序
        # SQL优化
        index_together = ('content_type', 'object_id')  # 联合唯一索引

    def __str__(self):
        return self.content


# 获取评论
class CommentDetailView(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = CommentsSerializer
    permission_classes = (IsAuthenticated,)
    queryset = Comment.objects.all()
    lookup_field = 'uuid_id'

    def build_tree(self, queryset):
        for obj in queryset:
            data = self.get_serializer(obj).data # 序列化
            data['subs'] = self.build_tree(obj.parent_comment.all()) # 反向解析取值
            yield data # 细节二:yield

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        data = self.build_tree([instance]) # 细节一:列表传参,方便递归
        return Response(data)

相关文章

  • 无限评论树状结构序列化构建

  • 预排序遍历树

    什么是左右值无限级分类左右值无限级分类,也称为预排序树无限级分类,是一种有序的树状结构,位于这些树状结构中的每一个...

  • 预排序树实现无限极分类

    一.概念 左右值无限级分类,也称为预排序树无限级分类 是一种有序的树状结构 于这些树状结构中的每一个节点都有一个 ...

  • golang 无限级树状结构

  • Mysql查询带树状结构的信息

    Mysql查询带树状结构的信息 在Oracle中有函数应用直接能够查询出树状的树状结构信息,例如有下面树状结构的组...

  • 20160822 评论功能

    评论 例:基于PC端的评论 畅言 多说 盖楼类型评论(css) 数据库存储结构 回复功能 评论模块 表单序列化

  • 评论盖楼-0823

    评论例:基于PC端的评论 畅言 多说盖楼类型评论(css) 数据库存储结构 回复功能 评论模块 表单序列化

  • oracle树形结构层级查询之start with ....co

    浅谈oracle树状结构层级查询 原文地址:浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查...

  • 浏览器渲染机制

    构建DOM树 DOM对象是浏览器解析HTML脚本生成的,最终输出一个树状结构的对象。 构建CSSOM树 CSSOM...

  • 浏览器渲染机制

    构建DOM树 DOM对象是浏览器解析HTML脚本生成的,最终输出一个树状结构的对象。 构建CSSOM树 CSSOM...

网友评论

      本文标题:无限评论树状结构序列化构建

      本文链接:https://www.haomeiwen.com/subject/rqtwnltx.html