0
我需要有多语种网站。为此,我编写了django模块,它收集了大量关于国家,城市及其翻译几乎所有语言的信息。如何提高页面加载速度?
下面是该模块的型号短版:
class LanguagesGroups(models.Model):
class Meta:
verbose_name = 'Language Group'
class Languages(models.Model):
iso_code = models.CharField("ISO Code", max_length=14, db_index=True)
group = models.ForeignKey(LanguagesGroups, on_delete=models.CASCADE, verbose_name='Group of ISO',
related_name='group', db_index=True)
class Cities(models.Model):
population = models.IntegerField(null=True)
territory_km2 = models.IntegerField(null=True)
class CitiesTranslations(models.Model):
common_name = models.CharField(max_length=188, db_index=True)
city = models.ForeignKey(Cities, on_delete=models.CASCADE, verbose_name='Details of City')
lang_group = models.ForeignKey(LanguagesGroups, on_delete=models.CASCADE, verbose_name='Language of city',
null=True)
class Meta:
index_together = (['common_name', 'city'],
['city', 'lang_group'])
我想展现给用户有关的地方,其用户与城市(取决于用户设置)的翻译版本要求的一些数据:
class Profile(models.Model):
title = models.CharField(_('title'), max_length=120)
info = models.TextField(_('information'), max_length=1500, blank=True)
city = models.ForeignKey(Cities, verbose_name=_('city'), null=True, blank=True)
def get_city(self):
user_lang = get_language() # en
lang_group = Languages.objects.get(iso_code=user_lang).group # 1823
return CitiesTranslations.objects.get(city=self.city, lang_group=lang_group).common_name
template.html
{% for item in object_list %}
{{ item.title }}
{{ item.get_city }}
{{ item.info }}
{% endfor %}
当我添加{{ item.get_city }}
,在分页的情况下,每页只有25个项目,页面加载速度下降到18倍,查询量(根据django-debug-tool)从2增加到102. django-debug-tool告诉我约有25个重复。
我该如何解决这个问题?
编辑: 我的观点
class ProfileListView(ListView):
model = Profile
template_name = 'profiles/profiles_list.html'
context_object_name = 'places_list'
paginate_by = 25
您可能是指'...__ iso_code = user_lang'而不是'...__ iso_code = lang_group'。这将查询从102个减少到52个。不错。关于“你可能想要的是分批获取所有东西,而不是单独的方法调用。” - 可能这就是我需要的:)你能推荐任何东西,怎么把这些东西分批? – TitanFighter
@TitanFighter您可以使用'.get(city = self.city_id,...)'来保存查询,或者如果您稍后需要城市,则可以使用'Profile.objects.select_related('city')'在您的原始查询中。第一个将使用本地外键值而不是获取相关对象。第二个将使用联接来获取提取配置文件的相同查询中的城市。 – knbk
@knbk谢谢。你的第一种方法结合Назар的回答给了我27个查询。我忘记了'city_id'技巧:) – TitanFighter