Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django中的嵌套分组依据:返回对象_Python_Django_Itertools - Fatal编程技术网

Python django中的嵌套分组依据:返回对象

Python django中的嵌套分组依据:返回对象,python,django,itertools,Python,Django,Itertools,我正试图在Django的queryset上使用一个经典的数据库GROUP_BY 我已经看过了,但区别在于: 我需要获取对象的词汇,而不是值(实际上不是values())返回的类型) 我需要得到一个嵌套的字典(也就是说,我需要在groupby上分组) 我的模型: class CitiesTable(models.Model): country = models.TextField() region_or_state = models.TextField() city

我正试图在Django的queryset上使用一个经典的数据库GROUP_BY

我已经看过了,但区别在于:

  • 我需要获取对象的词汇,而不是值(实际上不是
    values()
    )返回的类型)
  • 我需要得到一个嵌套的字典(也就是说,我需要在groupby上分组)
我的模型:

class CitiesTable(models.Model):
    country = models.TextField() 
    region_or_state = models.TextField() 
    city = models.TextField() 
我想按
国家
进行分类,然后,其中,按
地区或州
进行分类,其中有
城市
的列表:

我想去

{'USA':
    {'California': ['San Francisco', 'Los Angeles', ...],
     'Texas': ['Dallas', 'Houston', ...},
 'Germany':
     {'Bavaria': ['Munich', 'Nuremberg', ...}
}
但在这里,如前所述,列表中的城市应该是对象

我在Django中找不到如何获取它,因此,使用python中的
itertools
,我已经通过以下方式成功实现了外部组的功能: (帮我做这个:):


但是我没有将所有城市对象分组到它们的
地区或州

恐怕我不知道如何用django的QuerySet解决这个问题。可能没有解决方案,或者如果有,可能涉及使用未记录的功能

然而,python解决方案在大多数情况下都会很好。不管怎样,Django可能也要做类似的事情

看起来您当前的代码可能有点问题。在使用
itertools.groupby
之前,您几乎应该总是对条目进行排序-这是一个常见的陷阱,以至于我很惊讶它不会自动排序。Groupby遍历iterable,并在每次键的值更改时创建一个新组。因此,要对iterable进行完全分组,首先需要按键进行排序

在这里,您可以使用数据库进行排序,只需使用
groupby
两次:

queryset = CitiesTable.objects.order_by('country', 'region_or_state')

countries_dict = {}

for country, group in groupby(queryset, lambda x: x.country):
    countries_dict[country] = {}
    for region, inner_group in groupby(group, lambda x: x.region_or_state):
        countries_dict[country][region] = list(inner_group)

出于好奇:您是否考虑过为该查询编写原始sql并将其传递给
CitiesTable.objects.raw(…)
?你不会得到一个结构化的对象,而是一个包含国家、州和城市的平面列表,但按州和国家排序,你可以在退出一个组并停留在下一个组时检测到。此外,它的性能也会更高,因为它减少到一个查询
queryset = CitiesTable.objects.order_by('country', 'region_or_state')

countries_dict = {}

for country, group in groupby(queryset, lambda x: x.country):
    countries_dict[country] = {}
    for region, inner_group in groupby(group, lambda x: x.region_or_state):
        countries_dict[country][region] = list(inner_group)