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

Django values()能否序列化嵌套对象?仅需一级关联对象

Django values() 实现一级外键嵌套字典序列化

当然可以搞定你要的需求!Django 原生的 values() 方法本身不会直接返回嵌套的字典结构,但我们可以通过几种简单的技巧,轻松获取一级外键对象的完整字典(而不是仅ID)。下面给你分享几个实用的方案:

方法一:values() 字段提取 + 手动构造嵌套结构

这是最直接的方式,先用 values() 把外键的需要字段通过双下划线关联取出来,再手动整理成嵌套格式。

假设你有这样的模型:

from django.db import models

class User(models.Model):
    username = models.CharField(max_length=100)
    email = models.EmailField()

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

操作示例:

# 先通过values()取出所有需要的字段,包括外键的关联字段
raw_posts = Post.objects.values(
    'id',
    'title',
    'author__id',
    'author__username',
    'author__email'
)

# 手动转换为嵌套字典结构
formatted_posts = []
for post in raw_posts:
    formatted_post = {
        'id': post['id'],
        'title': post['title'],
        'author': {
            'id': post['author__id'],
            'username': post['author__username'],
            'email': post['author__email']
        }
    }
    formatted_posts.append(formatted_post)

这个方案的优势是完全基于Django ORM基础功能,不需要额外依赖,适合快速实现简单需求。

方法二:使用Django REST Framework序列化器(推荐复杂场景)

如果你的项目已经在用DRF,或者需要更优雅、可扩展的序列化方式,用 ModelSerializer 可以一步到位生成嵌套结构,还自带数据验证功能。

示例代码:

from rest_framework import serializers

# 先定义外键模型的序列化器
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'username', 'email']  # 按需指定要返回的字段

# 再定义主模型的序列化器,嵌套外键序列化器
class PostSerializer(serializers.ModelSerializer):
    author = UserSerializer()  # 直接嵌套,自动生成嵌套字典

    class Meta:
        model = Post
        fields = ['id', 'title', 'author']

# 使用方式
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
result = serializer.data  # 这里已经是带嵌套author字典的列表了

方法三:自定义序列化函数(轻量无依赖)

如果不想引入DRF,也可以自己写一个简单的序列化函数,直接遍历模型实例来构造嵌套结构:

def serialize_post(post_instance):
    """自定义序列化函数,把Post实例转为带嵌套author的字典"""
    return {
        'id': post_instance.id,
        'title': post_instance.title,
        'author': {
            'id': post_instance.author.id,
            'username': post_instance.author.username,
            'email': post_instance.author.email
        }
    }

# 使用方式
posts = Post.objects.all()
formatted_posts = [serialize_post(post) for post in posts]

总结

原生的 values() 虽然不直接支持嵌套,但通过字段提取后手动整理、序列化器或者自定义函数,都能轻松实现你要的一级外键嵌套字典效果。根据你的项目场景选择合适的方案就好~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:31:04