将 Django 查询集转换为 json 树

Convert a django queryset to json tree

假设我的模型中有两个表:

class Country(models.Model):
      CountryName = models.CharField(max_length=20)

class City(models.Model):
      CityName = models.CharField(max_length=20)
      Country = models.ForeignKey(Country)

在我看来我做了一个 json:

list = City.objects.annotate(CountryName=F('Country__CountryName')).values('CityName', 'CountryName').prefetch_related('Country')
return HttpResponse(json.dumps([any_entry for any_entry in list]))

结果我收到类似的东西:

{[{CityName: 'Vancouver', CountryName: 'Canada'},
  {CityName: 'Montreal', CountryName: 'Canada'},
  {CityName: 'Dallas', CountryName: 'USA'}]}

虽然我想要这样的东西:

{[
  {
    CountryName: 'Canada', 
    Cities: [{CityName: 'Vancouver'},
             {CityName: 'Montreal'}]
  },
  {
    CountryName: 'USA',
    Cities: [{CityName: 'Dallas'}]
  }
]}

或至少:

{
 Canada: ['vancouver','Montreal'],
 USA: ['Dallas']
}

最后,我使用了下面的代码:

from collections import defaultdict 
city_list = defaultdict(list)

for any_city in City.objects.annotate(CountryName=F('Country__CountryName')).values('CityName', 'CountryName'):
    city_list[any_city['CountryName']].append(any_city['CityName'])
return HttpResponse(json.dumps(city_list))