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

Django REST Framework如何在外键关联模型API中嵌套返回关联数据

解决方案

要实现关联评论直接嵌入项目API返回结果,用DRF的嵌套序列化器即可,按以下步骤调整:

1. 修正模型拼写问题(建议优先处理)

你当前的评论模型类名拼写错误,Comemnts 应为 Comments,如果不修正,后续反向关联的字段名会是 comemnts_set,容易出错。
如果需要自定义反向关联名,可修改外键定义:

class Comments(models.Model): # 修正类名拼写
    # 新增related_name参数,后续用comments作为反向关联字段名
    project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name="comments")
    name = models.CharField(max_length=150)
    comment = models.CharField(max_length=500)
    created = models.DateTimeField(auto_now_add=True)

修改模型后记得执行 makemigrations 和 migrate 同步数据库。

2. 调整序列化器配置

新增评论序列化器,同时修改项目序列化器,嵌入评论序列化逻辑:

from .models import *
from rest_framework.serializers import ModelSerializer

# 新增评论序列化器
class CommentsSerializer(ModelSerializer):
    class Meta:
        model = Comments
        # 可自定义需要返回的评论字段,不需要的可以删除
        fields = ["name", "comment", "created"]

class ProjectSerializer(ModelSerializer):
    # 嵌入评论序列化器,many=True表示一对多关联,read_only=True表示仅读取不用于写入
    comments = CommentsSerializer(many=True, read_only=True)
    class Meta:
        model = Project
        # 手动列出所有需要返回的字段,新增的comments字段要包含进去
        fields = ["id", "title", "body", "header_image", "demo", "code", "comments"]

如果你没有修改外键的related_name,请把上面的comments字段名替换为默认的comments_set(如果之前没修正类名拼写就是comemnts_set)。

3. 优化视图查询(可选但推荐)

为了避免查询时出现N+1性能问题,修改视图的查询逻辑,用prefetch_related提前预加载关联的评论数据:

@api_view(["GET"])
def getProjects(request):
    # 新增prefetch_related预加载评论
    project = Project.objects.all().prefetch_related("comments")
    serializer = ProjectSerializer(project, many=True)
    return Response(serializer.data)

@api_view(['GET'])
def getProject(request, pk):
    # 新增prefetch_related预加载评论
    project = Project.objects.prefetch_related("comments").get(id=pk)
    serializer = ProjectSerializer(project, many=False)
    return Response(serializer.data)

调整完成后调用项目API,返回结果中就会自动包含对应项目的所有评论列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:30:04