Python django中的嵌套分组依据:返回对象
我正试图在Django的queryset上使用一个经典的数据库GROUP_BY 我已经看过了,但区别在于: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
- 我需要获取对象的词汇,而不是值(实际上不是
)返回的类型)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)