最有效的方法从Django Queryset获取值列表

时间:2013-06-07 20:06:28

标签: python django list filter django-queryset

我可以看到相当多的不同选项,并希望得到一些关于最有效或“最佳实践”方法的反馈。

我得到一个带有filter()

的Django Queryset
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)

此查询集可能非常大(数十万行)。

现在需要进行的是转换为列表和编码为JSON。

选项(我在搜索中看到的):

  1. 循环查询集
  2. 示例:

    gps_time = [lp.gps_time for lp in c_layer_points];
    twtt = [lp.twtt for lp in c_layer_points];
    
    1. 使用values()或values_list()
    2. 使用iterator()
    3. 最后我想将json编码为这样的格式:

      {'gps_time':[list of all gps times],'twtt',[list of all twtt]}
      

      任何有关最佳方法的提示都会很棒,谢谢!

2 个答案:

答案 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中行末尾的;字符:)

希望这有帮助!