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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:32:26