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

如何在djangorestframework的Project接口中添加嵌套评论功能

DRF嵌套评论功能实现步骤

1. 修改models.py添加评论模型

新增Comment评论模型,通过外键和Project模型关联,修改后执行数据库迁移:

from django.db import models
from django.utils import timezone

class Project(models.Model):
    title = models.CharField(max_length=300)
    body = models.TextField(max_length=5000)
    header_image = models.ImageField(default="default.jpg")
    demo = models.URLField(null=True, blank=True)
    code = models.URLField(null=True, blank=True)

# 新增评论模型
class Comment(models.Model):
    # related_name参数用于Project反向查询关联评论
    project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name="comments")
    # 若有用户系统可替换为关联User表的外键:author = models.ForeignKey(User, on_delete=models.CASCADE)
    author_name = models.CharField(max_length=100)
    content = models.TextField(max_length=1000)
    created_at = models.DateTimeField(default=timezone.now)

    class Meta:
        # 评论默认按发布时间倒序排列
        ordering = ["-created_at"]

修改完成后执行迁移命令:

python manage.py makemigrations
python manage.py migrate

2. 修改serializers.py添加嵌套序列化逻辑

新增评论序列化器,在原有ProjectSerializer中添加嵌套的评论字段:

from rest_framework import serializers
from .models import Project, Comment

# 新增评论序列化器
class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        # 按需调整返回字段,不需要重复返回关联的项目ID
        fields = ["author_name", "content", "created_at"]

class ProjectSerializer(serializers.ModelSerializer):
    # 嵌套评论序列化器,many=True标识一对多关联,read_only=True设置为仅返回不参与写入校验
    comments = CommentSerializer(many=True, read_only=True)
    class Meta:
        model = Project
        fields = "__all__"

3. 优化views.py查询逻辑

使用prefetch_related预加载关联评论,避免N+1数据库查询问题:

@api_view(["GET"])
def getProjects(request):
    # 预加载所有关联评论,大幅提升接口响应性能
    project = Project.objects.all().prefetch_related("comments")
    serializer = ProjectSerializer(project, many=True)
    return Response(serializer.data)

可选扩展:新增评论提交接口(无独立评论查询接口)

如果需要支持用户提交评论,可新增仅支持POST的提交视图,不会暴露独立的评论查询接口:

@api_view(["POST"])
def add_comment(request, project_id):
    try:
        project = Project.objects.get(id=project_id)
    except Project.DoesNotExist:
        return Response({"error": "项目不存在"}, status=404)
    # 注入关联项目ID到请求参数
    request.data["project"] = project_id
    serializer = CommentSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=201)
    return Response(serializer.errors, status=400)

将该视图绑定到对应URL即可使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:54:03