Django中查询Product时如何返回嵌套结构的关联User字段?
解决Django查询关联模型返回嵌套结构的问题
你提到的values()方法本身会将关联字段(如user__username)展开为扁平的键值对,这是Django的默认行为。要得到你期望的嵌套结构,有两种常用方案:
方案一:使用Django REST Framework序列化器(推荐用于API场景)
如果你的项目使用DRF,定义序列化器可以轻松实现嵌套结构,同时还能自动处理数据验证和格式化:
from rest_framework import serializers from .models import Post, User # 定义用户子序列化器,仅返回需要的字段 class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['username', 'name'] # 定义文章序列化器,关联用户子序列化器 class PostSerializer(serializers.ModelSerializer): user = UserSerializer() class Meta: model = Post fields = ['id', 'title', 'user']
查询并序列化数据:
# 使用select_related优化关联查询,避免N+1问题 posts = Post.objects.select_related('user').all() nested_data = PostSerializer(posts, many=True).data
方案二:手动构造嵌套字典(无需额外依赖)
如果不使用DRF,可以先通过select_related优化查询,再遍历结果手动组装嵌套结构:
# 先查询出需要的字段,用select_related减少数据库查询次数 posts = Post.objects.select_related('user').values('id', 'title', 'user__username', 'user__name') # 遍历构造嵌套结构 nested_result = [] for post in posts: nested_result.append({ 'id': post['id'], 'title': post['title'], 'user': { 'username': post['user__username'], 'name': post['user__name'] } })
注:代码中将你示例里的Product.objects改为了Post.objects,因为你描述的是Post模型存在指向User的外键,应该是笔误。
内容的提问来源于stack exchange,提问作者Omar khaled
相关产品推荐
相关产品推荐

