Django查找类型(“iexact”,“icontains”,“month”等)在Django nonrel中不起作用(使用dbindexer)

时间:2013-04-23 09:53:34

标签: python django google-app-engine django-nonrel djangoappengine

我使用'django nonrel'创建了一个应用程序,并使用'django dbindexer'来允许正常的Django查找。设置文件如下

的myproject / settings.py

from djangoappengine.settings_base import *

import os

DATABASES['native'] = DATABASES['default']
DATABASES['default'] = {'ENGINE': 'dbindexer', 'TARGET': 'native'}
AUTOLOAD_SITECONF = 'indexes'
SITE_ID = 1
SECRET_KEY = '=r-$b*8hglm+858&9t043hlm6-&6-3d3vfc4((7yd0dbrakhvi'
AUTH_PROFILE_MODULE = 'myapp.UserProfile'


DBINDEXER_BACKENDS = (
    'dbindexer.backends.BaseResolver',
    'dbindexer.backends.FKNullFix',
    'dbindexer.backends.ConstantFieldJOINResolver',
)

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.sites',
    'django.contrib.contenttypes',
    'django.contrib.auth',
    'django.contrib.sessions',
    'django.contrib.staticfiles',
    'django.contrib.messages',
    'djangotoolbox',
    'autoload',
    'dbindexer',
    'myapp',

    'djangoappengine',
)

MIDDLEWARE_CLASSES = (
    'autoload.middleware.AutoloadMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.media',
    'django.core.context_processors.static',
    'django.core.context_processors.request',
)

TEST_RUNNER = 'djangotoolbox.test.CapturingTestSuiteRunner'

ROOT_URLCONF = 'myproject.urls'

gettext = lambda s: s
SETTINGS_PATH = os.path.abspath(os.path.dirname(__file__))
temp = os.path.join(SETTINGS_PATH, os.pardir)
ROOT = os.path.join(os.path.normpath(temp))

STATIC_ROOT = os.path.join(ROOT, 'collected_static')

STATIC_URL = '/static/'

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

AUTH_PROFILE_MODULE = 'myapp.UserProfile'

我在'myapp'文件夹中创建了一个'dbindexes'文件来添加索引定义。

的myapp / dbindexes.py

from models import *
from dbindexer.lookups import StandardLookup
from dbindexer.api import register_index

register_index(myModel, {'first_name': 'icontains',
                         'last_name':  'icontains',
                           })

主文件夹中的'indexes'文件如下所示:

indexes.py

from dbindexer import autodiscover
autodiscover()

现在,当我使用已注册的索引查询“myModel”时,它总是返回一个空列表。似乎正在发现索引,因为它不会引发任何错误。但是,当我在'myapp / dbindexes.py'文件中将'icontains'更改为'contains'时,它会给出预期的结果。

有人可以指导我解决问题。

感谢!!!

1 个答案:

答案 0 :(得分:2)

dbindexer实质上会自动对您的实体进行非规范化,并添加其他可索引字段以帮助查询。例如,GAE不进行不区分大小写的搜索或子字符串搜索,因此如果需要使用icontains,它会生成一个小写子字符串列表,并将其存储在ListField中,该列表是可索引的。当您编写实体时会发生这种情况。

请注意,由于它会使您的数据存储空间膨胀,并且使用了索引,因此最终会非常昂贵。

运行查询时,您只能查询数据存储区中的实体。如果您的dbindexes.py在某一时刻指定了contains,那么将使用contains的搜索字段创建实体,icontains的查询将无法找到您要查找的内容。如果添加新实体,并且它们具有正确的可索引数据,那么它们应该是可查询的,但查询中不会返回旧实体。

您可以使用数据存储区查看器查看与您的实体一起编写的dbindexer。如果某些实体没有额外的dbindexer生成的属性,那么这些查询将不会返回。您可以通过读取和写入所有实体来解决此问题,以便dbindexer更新字段。