我想在我的Django的queryset上使用經典的數據庫GROUP_BY。django嵌套GROUP BY:返回對象
我已經看到How to query as GROUP BY in django?但區別是:
- ,我需要得到對象的dictionnary,沒有值(實際上不是的東西通過
values()
返回類型)。 - 我需要得到一個嵌套字典(即我需要在GROUP_BY GROUP_BY)。
我的模型:
class CitiesTable(models.Model):
country = models.TextField()
region_or_state = models.TextField()
city = models.TextField()
我想country
進行分類,然後,其中,由region_or_state
其中裏面有在city
名單:
我想
{'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
中的所有城市對象分組。
只是出於好奇:你有沒有考慮寫原始SQL該查詢並將它傳遞給'CitiesTable.objects。原始(...)'?你不會得到一個結構化的對象,而是一個包括國家,州和城市在內的平面列表,但是當你從一個組退出並保持下一個時,你可以檢測到狀態和國家排序。此外,它會更好的表現,因爲它減少到一個查詢 – FSp