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

Django DRF嵌套序列化器报错及无数据返回问题求助

解决DRF嵌套JSON序列化的问题

看起来你遇到的核心问题是对DRF嵌套序列化器的使用场景理解偏差:你的Test模型本身就包含了坐标、属性相关的字段,并不是一对多的关联关系,但你错误地使用了many=True,导致DRF试图去查找不存在的关联集合,要么报错要么返回空数据。

问题根源拆解

  1. 初始的AttributeError:你定义的TestSerializer里coordinates = coordinatesSerializer(many=True, ...),DRF会尝试从Test对象上获取coordinates属性(比如反向关联的Manager),但你的Test模型根本没有这个字段/关联,所以抛出'Test' object has no attribute 'coordinates'。
  2. 修改后返回空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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:35:06