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

时间:2016-09-05 10:10:49

标签: django django-forms django-queryset

我有一个简单的模型:

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

此类问题的最佳做法是什么?

enter image description here

2 个答案:

答案 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