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

如何在Django Rest Framework中关联模型并展示为单个JSON

解决将维度表数据关联到事实表API视图的问题

1. 为维度表外键设置反向关联名称

在每个维度表的ForeignKey字段中添加related_name参数,方便从fScenario对象直接获取关联的维度数据:

# models.py 修改dADA类的外键字段
class dADA(models.Model):
    # 添加related_name,自定义反向关联属性名
    scenarioId = models.ForeignKey(fScenario, on_delete=models.CASCADE, related_name='ada_instances')
    # 其他字段保持不变...

其余5个维度表按同样方式处理,比如dOtherModel的外键设置related_name='other_model_instances',确保每个related_name唯一。

2. 修改fScenarioSerializer,嵌套维度表序列化器

在fScenarioSerializer中添加关联的维度表字段,使用对应序列化器并设置many=True(一对多关系):

# serializers.py
class fScenarioSerializer(serializers.ModelSerializer):
    # 嵌套dADA序列化器,读取关联数据
    ada_instances = dADASerializer(many=True, read_only=True)
    # 其他维度表依次添加:
    # other_model_instances = dOtherModelSerializer(many=True, read_only=True)

    class Meta:
        model = fScenario
        # 将新增的关联字段加入返回字段列表
        fields = ['scenarioId', 'description', 'ada_instances']

3. 优化查询性能,避免N+1查询

在fScenarioViewSet的queryset中使用prefetch_related预加载关联数据,提升API响应速度:

# views.py
class fScenarioViewSet(viewsets.ModelViewSet):
    # 预加载所有关联的维度表数据
    queryset = fScenario.objects.all().prefetch_related('ada_instances')
    # 多维度表时扩展:
    # queryset = fScenario.objects.all().prefetch_related('ada_instances', 'other_model_instances')
    serializer_class = fScenarioSerializer

效果验证

访问fScenario的详情API(如/fScenario/1/),返回的JSON会包含该场景对应的所有dADA数据,示例格式:

{
    "scenarioId": 1,
    "description": "测试场景",
    "ada_instances": [
        {
            "dateTimeId": "2024-05-20T12:00:00Z",
            "latitutde": 30.123,
            "longitude": 120.456,
            "instanceType": "ADA"
        }
    ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:57:06