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

