Django如何返回包含外键实体的数据库数据为JSON?
嗨,这个需求我之前也碰到过,给你分享几种实用的实现方式,看哪种适合你的场景:
方法一:嵌套序列化器(推荐,适合Django REST Framework场景)
如果你的项目用的是Django REST Framework(DRF),这是最规范的做法。假设Foo和Bar是外键关联(比如Foo里有bar = models.ForeignKey(Bar, on_delete=models.CASCADE)):
- 先定义Bar的序列化器:
from rest_framework import serializers from .models import Bar class BarSerializer(serializers.ModelSerializer): class Meta: model = Bar fields = '__all__' # 也可以指定具体字段,比如['id', 'name', 'description']
- 在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
相关产品推荐
相关产品推荐

