我有一个简单的模型:
class Sheker(models.Model):
name = models.CharField(max_length=90)
display_name = models.CharField(max_length=90, null=True)
search_name = models.CharField(max_length=90, null=True)
def __unicode__(self):
return self.search_name
class Sod(models.Model):
name = models.CharField(null=False, blank=False, max_length=100)
sheker = models.ManyToManyField(Sheker, blank=True, name='sheker')
用简单的形式:
from django import forms
from django.contrib.admin.widgets import FilteredSelectMultiple
from rosh.models import *
class SodForm(forms.ModelForm):
sheker = forms.ModelMultipleChoiceField(
queryset=Sheker.objects.all(),
widget=FilteredSelectMultiple("sheker", is_stacked=False),
required=False
)
模型Sheker
在db中有超过12K行(带有地理扩展的postgres) - 问题是它使表单加载超慢=超过5秒加载html。
问题是queryset=Sheker.objects.all()
吗?如何使其加载速度更快/缓存它或其他东西以快速加载页面(如普通网页)。
此类问题的最佳做法是什么?
答案 0 :(得分:2)
如果更频繁地执行查询,您可以使用缓存数据库来保存值,那么这将是一个很好的解决方案。
如果页面经常使用,您可以缓存[整个视图](https://docs.djangoproject.com/en/dev/topics/cache/#the-per-view-cache),或者只是查询适合您的应用程序的查询。
您可以缓存查询集结果,如下所示:
from django.core.cache import cache
from django import forms
from django.contrib.admin.widgets import FilteredSelectMultiple
from rosh.models import *
class SodForm(forms.ModelForm):
# Check if the result is already cached
sheker_results = cache.get('sheker_results'): # Returns None if not cached earlier
# If the result is None, then query the database and set the cache
if sheker_results is None:
sheker_results = Sheker.objects.all()
cahce.set('sheker_results', sheker_results)
sheker = forms.ModelMultipleChoiceField(
queryset= sheker_results,
widget=FilteredSelectMultiple("sheker", is_stacked=False),
required=False
)
这个post描述了django中的缓存。
答案 1 :(得分:0)
可以在表单中设置字段自动完成,它将缓解表单并快速加载页面,该字段将仅使用数据库加载数据。
然后加速postgresql