如何优化django查询

如何优化django查询,django,Django,我有一个函数,可以将国家名称作为关键字,城市名称作为值。以下是我所做的,看起来不是最好的方法。我正在使用调试工具栏,其中显示了30个sql查询,用于获取此信息。我该怎么做才对呢 #models.py class City(models.Model): ci_id = models.AutoField(primary_key=True) ci_name = models.CharField(max_length=50, blank=True, null=True) coun

我有一个函数,可以将国家名称作为关键字,城市名称作为值。以下是我所做的,看起来不是最好的方法。我正在使用调试工具栏,其中显示了30个sql查询,用于获取此信息。我该怎么做才对呢

#models.py
class City(models.Model):
    ci_id = models.AutoField(primary_key=True)
    ci_name = models.CharField(max_length=50, blank=True, null=True)
    country_co = models.ForeignKey('Country', on_delete=models.CASCADE, null=False)

   


class Country(models.Model):
    co_id = models.AutoField(primary_key=True)
    co_name = models.CharField(max_length=50, blank=True, null=True)

#views.py

def get_country_city():
    city_dict={}
    countries = Country.objects.all()
    for country in countries:
        c_list =[]
        cities = City.objects.filter(country_co__co_id=country.co_id)
        for city in cities:
            c_list.append(city.ci_name)
        city_dict[country.co_name] = c_list
    return city_dict
您可以使用以通过一个额外的查询获取所有
城市
s:

def get_country_city():
    countries = Country.objects.prefetch_related('city_set')
    return {
        country.co_name: [city.ci_name for ci in country.city_set.all()]
        for country in counties
    }

您可以通过一个查询来实现这一点

from collections import defaultdict
city_dict = defaultdict(list)
for co_name, ci_name in City.objects.values_list('country_co__co_name', 'ci_name'):
    city_dict[co_name].append(ci_name)

这个城市目录被用来做什么?我用它作为对ajax请求的响应。哇!这将查询从30个减少到了9个。谢谢你的帮助
from collections import defaultdict
city_dict = defaultdict(list)
for co_name, ci_name in City.objects.values_list('country_co__co_name', 'ci_name'):
    city_dict[co_name].append(ci_name)