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

Django Rest Framework主外键关联模型嵌套JSON输出报错如何解决

问题原因与解决方案

1. 报错根因

你触发'ListSerializer' object is not iterable报错的原因是:直接遍历了序列化器实例TagItemSerializeobj,而非序列化后的数据结果,需要访问序列化器的.data属性才能拿到可迭代的序列化后列表。另外你手动拼接嵌套结构的逻辑效率低、容易出错,完全可以用DRF自带的嵌套序列化能力实现需求。

2. 代码调整步骤

2.1 修改模型(添加反向关联别名)

先给TagItem的外键字段添加related_name参数,方便从Tags侧反向查询关联的所有TagItem:

# models.py
class Tags(models.Model):
    tagId = models.CharField(primary_key=True, max_length=100, default=1)
    section = models.CharField(max_length=100)

class TagItem(models.Model):
    # 加related_name="items",和期望输出的items字段对应
    tagId = models.ForeignKey(Tags, on_delete=models.CASCADE, default=1, related_name="items")
    select = models.BooleanField(default=False)
    name = models.CharField(max_length=50)

修改后执行python manage.py makemigrations和python manage.py migrate同步数据库变更。

2.2 编写正确的嵌套序列化器

# serializers.py (如果没有该文件直接新建即可)
from rest_framework import serializers
from .models import Tags, TagItem

class TagItemSerializer(serializers.ModelSerializer):
    id = serializers.CharField(source='id')
    class Meta:
        model = TagItem
        fields = ['id', 'select', 'name']

class TagsSerializer(serializers.ModelSerializer):
    id = serializers.CharField(source='tagId') # 将Tags的tagId映射到输出的id字段
    items = TagItemSerializer(many=True, read_only=True) # 嵌套关联的TagItem列表
    class Meta:
        model = Tags
        fields = ['id', 'section', 'items']

2.3 简化视图逻辑

不需要单独查询TagItem,直接查询Tags后序列化即可,DRF会自动加载关联的嵌套数据:

# views.py
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import Tags
from .serializers import TagsSerializer

@api_view(['GET'])
def get_tag_details(request):
    # prefetch_related优化查询性能,避免N+1查询问题
    tags = Tags.objects.all().prefetch_related('items')
    serializer = TagsSerializer(tags, many=True)
    return Response(serializer.data)

3. 效果验证

调整后接口返回的格式和你期望的完全一致,会自动把对应Tags下关联的所有TagItem放到items数组中。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 01:45:02