4

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

我的项目/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',
                           })

主文件夹中的“索引”文件如下所示:

索引.py

from dbindexer import autodiscover
autodiscover()

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

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

谢谢!!!

4

1 回答 1

3

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

请注意,这最终可能会非常昂贵,因为它会膨胀您的数据存储和使用的索引。

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

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

于 2013-04-23T19:48:43.007 回答