我使用'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'时,它会给出预期的结果。
有人可以指导我解决问题。
感谢!!!
答案 0 :(得分:2)
dbindexer实质上会自动对您的实体进行非规范化,并添加其他可索引字段以帮助查询。例如,GAE不进行不区分大小写的搜索或子字符串搜索,因此如果需要使用icontains
,它会生成一个小写子字符串列表,并将其存储在ListField中,该列表是可索引的。当您编写实体时会发生这种情况。
请注意,由于它会使您的数据存储空间膨胀,并且使用了索引,因此最终会非常昂贵。
运行查询时,您只能查询数据存储区中的实体。如果您的dbindexes.py在某一时刻指定了contains
,那么将使用contains
的搜索字段创建实体,icontains
的查询将无法找到您要查找的内容。如果添加新实体,并且它们具有正确的可索引数据,那么它们应该是可查询的,但查询中不会返回旧实体。
您可以使用数据存储区查看器查看与您的实体一起编写的dbindexer。如果某些实体没有额外的dbindexer生成的属性,那么这些查询将不会返回。您可以通过读取和写入所有实体来解决此问题,以便dbindexer更新字段。