gpt4 book ai didi

python - Django 中的嵌套 GROUP BY : returning Objects

转载 作者:行者123 更新时间:2023-12-01 04:22:40 24 4
gpt4 key购买 nike

我正在尝试在 Django 中的查询集上使用经典数据库 GROUP_BY。

我已经看过How to query as GROUP BY in django?但区别是:

  • 我需要获取对象的字典,而不是值(实际上不是values()返回的事物的类型)。
  • 我需要获取一个嵌套字典(即我需要对 GROUP_BY 进行 GROUP_BY)。

我的模型:

class CitiesTable(models.Model):
country = models.TextField()
region_or_state = models.TextField()
city = models.TextField()

我想按国家/地区进行分类,然后按region_or_state进行分类,其中包含城市的列表:

我想要得到

{'USA':
{'California': ['San Francisco', 'Los Angeles', ...],
'Texas': ['Dallas', 'Houston', ...},
'Germany':
{'Bavaria': ['Munich', 'Nuremberg', ...}
}

但是,如前所述,列表中的城市应该是对象

我没有找到如何在 Django 中获取它,因此,在 python 中使用 itertools ,我已经成功获取了外部 GROUP_BY:(帮我解决这个问题:How to convert tuple to a multi nested dictionary in python?):

from itertools import groupby

def show_cities(request):
queryset = CitiesTable.objects.all()
grouped_cities = []
unique_countries = []
for k, g in groupby(queryset, lambda x: x.country):
grouped_cities.append(list(g))
unique_countries.append(k)
return render(request, 'cities/show_cities.html',
{'cities':grouped_cities, 'countries':unique_countries})

但我无法将所有城市对象分组到其 region_or_state 中。

最佳答案

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

但是,Python 解决方案在大多数情况下都可以正常工作。无论如何,Django 可能必须做一些类似的事情。

您当前的代码似乎可能存在一些小问题。在使用 itertools.groupby 之前,您几乎应该总是对条目进行排序 - 这是一个常见的陷阱,以至于我很惊讶它不会自动排序。 Groupby 迭代可迭代对象,并在每次键的值发生变化时创建一个新组。因此,要对可迭代对象进行完全分组,您需要首先按键进行排序。

在这里,您可以使用数据库进行排序,只需使用 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)

关于python - Django 中的嵌套 GROUP BY : returning Objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33528817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com