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
相关产品推荐
相关产品推荐

