django-autocomplete-light:如何缓存选择?

时间:2014-05-11 08:50:42

标签: python django django-autocomplete-light

我拥有自己的城市模型(不是django-cities-light),MySQL表中的记录超过2M。每次我开始输入自动填充字段时,htop表上的CPU负载在mysqld进程上跳跃超过200%,因此它看起来脚本在每个自动完成时请求表。

我想把表放入memcache以避免这种情况,这就是我到目前为止所做的:

autocomplete_light_registry.py

import autocomplete_light
from django.core.cache import cache, InvalidCacheBackendError
from cities.models import City

def prepare_choices(model):
    key = "%s_autocomplete" % model.__name__.lower()
    try:
        qs = cache.get(key)
        if cache.get(key): # return if not expired
            return qs
    except InvalidCacheBackendError:
        pass
    qs = model.objects.all()     # populate cache
    cache.set(key, qs, 60*60*24) # if expired or not set
    return qs

class CityAutocomplete(autocomplete_light.AutocompleteModelBase):
    search_fields = ['city_name']
    choices = prepare_choices(City)
autocomplete_light.register(City, CityAutocomplete)

但它仍然继续请求mysql。

有什么建议吗?

更新

我尝试在django shell中为cities表设置缓存,但该过程因 Segmentation fault 消息而中断。

>>> from django.core.cache import cache
>>> qs = City.objects.all()
>>> qs.count()
2246813
>>> key = 'city_autocomplete'
>>> cache.set(key, qs, 60*60*24)
Segmentation fault

但是我能够将较小的表放入缓存中,我希望能够克服这个问题,所以仍然需要答案。

1 个答案:

答案 0 :(得分:1)

  

cache.set(key,qs,60 * 60 * 24)分段错误

这是因为查询很大。 您将需要在过滤后对其进行缓存。

这就是我这样做的方式。不完美,但确实可以很好地使用500个元素。

def get_autocomplete(request):
    if request.is_ajax():
        q = request.GET.get('term', '')
        results_list = MY_model.objects.filter(title__contains=q).all()
        results = []
        for result in results_list:
            results.append(result)
        data = json.dumps(results)
    else:
        data = 'Nothing to see here!'
    mimetype = 'application/json'
    return http.HttpResponse(data, mimetype)

在网上找到了这个。

您最多需要前10个元素,因为其余部分会弹出屏幕。