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()
原代码错误原因
你之前的写法存在两个问题:
- 用Python的
if F('parentId') else "None"无效,F()是数据库层面的表达式,无法在Python代码中直接判断其是否为空; - 子查询没有用
Subquery包裹,Django无法识别为合法的子查询表达式。
内容的提问来源于stack exchange,提问作者unnonusr
相关产品推荐
相关产品推荐

