Django表单queryset = model.objects.all()加载缓慢

我有一个简单的模型:

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()?如何使其加载速度更快/缓存它或其他东西以快速加载页面(如普通网页).

这种问题的最佳做法是什么?

《Django表单queryset = model.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中的缓存.

点赞