我有一个简单的模型:
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(postgres with geo extensions)中有超过12K行 – 问题是它使表单加载超慢=超过5秒加载html.
问题是queryset = Sheker.objects.all()?如何使其加载速度更快/缓存它或其他东西以快速加载页面(如普通网页).
这种问题的最佳做法是什么?
最佳答案 如果更频繁地执行查询,您可以使用缓存数据库来保存值,那么这将是一个很好的解决方案.
如果经常使用页面,您可以缓存[整个视图](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中的缓存.