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

Django中如何在查询Comment模型时关联父评论数据?

解决方案

方法一:使用select_related关联查询(推荐)

因为parentId是自关联外键,直接用select_related可以一次性查询出评论及其父评论的数据,避免多次数据库查询,之后通过序列化器处理成嵌套格式即可。

查询代码:

query = Comment.objects.filter(user=request.user).select_related('parentId').all()

配合Django REST Framework序列化器实现期望的返回格式:

from rest_framework import serializers

class ParentCommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = ['id', 'body']

class CommentSerializer(serializers.ModelSerializer):
    # 将parentId字段用父评论序列化器处理
    parentId = ParentCommentSerializer(read_only=True)

    class Meta:
        model = Comment
        fields = ['id', 'body', 'parentId']

序列化后返回的数据就会是你期望的嵌套结构。

方法二:使用Subquery自定义父评论字段

如果需要在数据库查询阶段就将父评论的指定字段封装成嵌套结构,可以通过Subquery和JSONField实现(要求Django 3.1及以上版本):

from django.db.models import OuterRef, Subquery, JSONField, F

# 定义子查询,获取父评论的id和body并封装为JSON对象
parent_subquery = Comment.objects.filter(id=OuterRef('parentId')).annotate(
    parent_data=JSONField(data={'id': F('id'), 'body': F('body')})
).values('parent_data')[:1]

# 给评论查询集添加parentId注释
query = Comment.objects.filter(user=request.user).annotate(
    parentId=Subquery(parent_subquery)
).all()

原代码错误原因

你之前的写法存在两个问题:

  1. 用Python的if F('parentId') else "None"无效,F()是数据库层面的表达式,无法在Python代码中直接判断其是否为空;
  2. 子查询没有用Subquery包裹,Django无法识别为合法的子查询表达式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:05:37