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

Django如何返回包含外键实体的数据库数据为JSON?

嗨,这个需求我之前也碰到过,给你分享几种实用的实现方式,看哪种适合你的场景:

方法一:嵌套序列化器(推荐,适合Django REST Framework场景)

如果你的项目用的是Django REST Framework(DRF),这是最规范的做法。假设Foo和Bar是外键关联(比如Foo里有bar = models.ForeignKey(Bar, on_delete=models.CASCADE)):

  1. 先定义Bar的序列化器:
from rest_framework import serializers
from .models import Bar

class BarSerializer(serializers.ModelSerializer):
    class Meta:
        model = Bar
        fields = '__all__'  # 也可以指定具体字段,比如['id', 'name', 'description']
  1. 在Foo的序列化器里嵌套BarSerializer:
class FooSerializer(serializers.ModelSerializer):
    # 这里的字段名要和Foo模型中关联Bar的字段名一致,比如叫bar
    bar = BarSerializer()

    class Meta:
        model = Foo
        fields = ['id', 'foo_title', 'foo_content', 'bar']  # 包含Foo自身字段和嵌套的bar

这样用FooSerializer序列化Foo对象时,返回的JSON就会自动包含关联Bar的属性,完美符合你要的嵌套格式。

方法二:手动构造返回字典(适合无序列化框架的简单视图)

如果你的视图是手动处理JSON返回,不用序列化框架,可以自己拼接包含关联属性的字典:

from django.http import JsonResponse
from .models import Foo

def foo_detail(request, pk):
    # 用select_related避免N+1查询,优化性能
    foo = Foo.objects.select_related('bar').get(pk=pk)
    # 构造嵌套结构的返回数据
    response_data = {
        'id': foo.id,
        'foo_title': foo.foo_title,
        'foo_content': foo.foo_content,
        'bar': {
            'id': foo.bar.id,
            'bar_name': foo.bar.bar_name,
            'bar_desc': foo.bar.bar_desc
        }
    }
    return JsonResponse(response_data)
方法三:模型values()方法(适合批量查询场景)

如果是批量返回Foo列表,也可以用values()直接指定关联字段:

from django.http import JsonResponse
from .models import Foo

def foo_list(request):
    # 用select_related优化查询
    foo_list = Foo.objects.select_related('bar').values(
        'id', 'foo_title', 
        'bar__id', 'bar__bar_name', 'bar__bar_desc'
    )
    # 转成列表后返回JSON
    return JsonResponse(list(foo_list), safe=False)

不过这种方式返回的Bar属性是平级的(比如bar__id),如果需要严格的嵌套结构,前两种方法更合适。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:59:23