如何在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
相关产品推荐
相关产品推荐

