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

