在API视图中正确使用查询集和JSON

时间:2019-07-16 07:56:29

标签: json django serialization django-rest-framework django-queryset

我正在尝试编写我的自定义API视图,并且在查询集和JSON方面有些挣扎。它不应该那么复杂,但是我仍然被困住了。另外,我对我编写的循环的某些奇怪行为感到困惑。

这是我的观点:

@api_view()
def BuildingGroupHeatYear(request, pk, year):

    passed_year = str(year)
    building_group_object = get_object_or_404(BuildingGroup, id=pk)
    buildings = building_group_object.buildings.all()

    for item in buildings:
        demand_heat_item = item.demandheat_set.filter(year=passed_year).values('building_id', 'year', 'demand')


    print(demand_heat_item)
    print(type(demand_heat_item)

    return Response(demand_heat_item))

好吧,这实际上使我完全得到了我想要的东西。即:

{'building_id': 1, 'year': 2019, 'demand': 230.3}{'building_id': 1, 'year': 2019, 'demand': 234.0}

好的,很好,但是为什么呢?每次循环经过时都不应覆盖数据吗?

同样,当我获得了demand_heat_item的类型时,我又返回了一个查询集<class 'django.db.models.query.QuerySet'>

但这是一个API视图,因此我想找回JSON。那不是应该给我一个错误吗?

我该怎么做,以便获得与JSON相同的数据结构?

它试图像这样重写它,但是没有成功,因为我无法序列化它:

@api_view()
def BuildingGroupHeatYear(request, pk, year):

    passed_year = str(year)
    building_group_object = get_object_or_404(BuildingGroup, id=pk)
    buildings = building_group_object.buildings.all()

         demand_list = []

    for item in buildings:
        demand_heat_item = item.demandheat_set.filter(year=passed_year).values('building_id', 'year', 'demand')
        demand_list.append(demand_heat_item)

    json_data = json.dumps(demand_list)

    return Response(json_data)

我还尝试了JSON Response和Json解码器。

但是也许有更好的方法可以做到这一点?

或者也许我的问题表达得更清晰,像这样:如何从循环中获取数据,并将其作为JSON返回

非常感谢您的帮助。在此先感谢!

此外,我尝试了以下操作:

 for item in buildings:
        demand_heat_item = item.demandheat_set.filter(year=passed_year).values('building_id', 'year', 'demand')

    json_data = json.dumps(list(demand_heat_item))

    return Response(json_data)

这给了我我不想要的奇怪答案:

"[{\"building_id\": 1, \"year\": 2019, \"demand\": 230.3}, {\"building_id\": 1, \"year\": 2019, \"demand\": 234.0}]"

0 个答案:

没有答案