我可以看到相当多的不同选项,并希望得到一些关于最有效或“最佳实践”方法的反馈。
我得到一个带有filter()
的Django Querysetc_layer_points = models.layer_points.objects.filter(location_id=c_location.pk,season_id=c_season.pk,line_path_id=c_line_path.pk,radar_id=c_radar.pk,layer_id__in=c_layer_pks,gps_time__gte=start_gps,gps_time__lte=stop_gps)
此查询集可能非常大(数十万行)。
现在需要进行的是转换为列表和编码为JSON。
选项(我在搜索中看到的):
示例:
gps_time = [lp.gps_time for lp in c_layer_points];
twtt = [lp.twtt for lp in c_layer_points];
最后我想将json编码为这样的格式:
{'gps_time':[list of all gps times],'twtt',[list of all twtt]}
任何有关最佳方法的提示都会很棒,谢谢!
答案 0 :(得分:4)
您可能无法从ORM获取所需的格式。但是,您可以有效地执行以下操作:
c_layer_points = models.layer_points.objects.filter(location_id=c_location.pk, season_id=c_season.pk, line_path_id=c_line_path.pk,radar_id=c_radar.pk, layer_id__in=c_layer_pks, gps_time__gte=start_gps, gps_time__lte=stop_gps).values_list('gps_time', 'twtt')
现在将元组分成两个列表:(元组解包)
split_lst = zip(*c_layer_points)
dict(gps_time=list(split_lst[0]), twtt=list(split_lst[1]))
答案 1 :(得分:2)
我建议你使用遍历查询集的迭代,并从查询集中逐个元素地遵循json字典。
通常,Django的QuerySets是懒惰的,这意味着无论何时访问它们都会加载到内存中。如果加载整个列表:gps_time = [lp.gps_time for lp in c_layer_points]
,您将拥有内存中的所有对象(数千个)。通过简单的迭代你会很好:
for item in c_layer_points:
#convert item to json and add it to the
#json dict.
顺便说一句,你不需要python中行末尾的;
字符:)
希望这有帮助!