Django DRF嵌套序列化器报错及无数据返回问题求助
解决DRF嵌套JSON序列化的问题
看起来你遇到的核心问题是对DRF嵌套序列化器的使用场景理解偏差:你的Test模型本身就包含了坐标、属性相关的字段,并不是一对多的关联关系,但你错误地使用了many=True,导致DRF试图去查找不存在的关联集合,要么报错要么返回空数据。
问题根源拆解
- 初始的AttributeError:你定义的
TestSerializer里coordinates = coordinatesSerializer(many=True, ...),DRF会尝试从Test对象上获取coordinates属性(比如反向关联的Manager),但你的Test模型根本没有这个字段/关联,所以抛出'Test' object has no attribute 'coordinates'。 - 修改后返回空JSON:保留
many=True的情况下,DRF找不到对应的关联集合,就会返回空数组[],而不是你预期的嵌套对象结构。
正确的序列化方案
因为每个Test实例本身就包含所有需要的字段,我们只需要把这些字段分组嵌套输出即可,不需要关联关系。这里用source='*'指定嵌套序列化器使用当前实例作为数据源,同时去掉many=True(因为每个Test对应一组坐标/属性,不是多组):
修改后的serializer.py
from rest_framework import serializers from rentlistings.models import Test # 遵循PEP8规范,类名首字母大写 class CoordinatesSerializer(serializers.ModelSerializer): class Meta: model = Test fields = ('latitude', 'longitude') class PropertiesSerializer(serializers.ModelSerializer): class Meta: model = Test # 去掉重复的'price'字段,避免DRF警告 fields = ('price', 'yields', 'num_floor', 'num_rooms', 'elevator', 'garage', 'balcony_size', 'garden_area', 'parking', 'terass', 'loggia', 'cellar', 'hash_id') class TestSerializer(serializers.ModelSerializer): # source='*' 表示将当前Test实例传入嵌套序列化器 coordinates = CoordinatesSerializer(source='*', read_only=True) properties = PropertiesSerializer(source='*', read_only=True) class Meta: model = Test fields = ('coordinates', 'properties')
views.py保持不变
from rentlistings.models import Test from rentlistings.serializers import TestSerializer from rest_framework import generics class test_list(generics.ListCreateAPIView): queryset = Test.objects.all() serializer_class = TestSerializer
效果验证
现在访问/listings.json,你会得到预期的嵌套JSON结构:
[ { "coordinates": { "latitude": 12.345, "longitude": 67.890 }, "properties": { "price": 100000, "yields": 3.5, // ...其他属性字段 } }, // ...更多Test实例 ]
额外提示
- 保持代码规范:类名首字母大写、避免字段重复,能减少不必要的调试成本。
- 如果后续需要扩展为一对多关联(比如一个Test对应多个坐标点),再考虑使用
many=True并在模型中建立ForeignKey关联。
内容的提问来源于stack exchange,提问作者Svarto
相关产品推荐
相关产品推荐

