3

我使用'django nonrel'创建了一个应用程序,并使用'django dbindexer'来允许正常的Django查找。设置文件是如下Django查找类型(“iexact”,“icontains”,“month”等)不能在Django nonrel中使用(使用dbindexer)

的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.py

from dbindexer import autodiscover 
autodiscover() 

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

有人能指导我解决问题。

谢谢!

回答

2

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

请注意,这会导致您的数据存储膨胀并使用索引,因此可能会非常昂贵。

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

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

+0

感谢您的解释。您建议使用数据存储查看器(http://127.0.0.1:8000/_ah/admin/)来检查数据是关键。一旦我们用新的查找修改'dbindexes.py',是否有其他方法可以重置已经索引的现有数据的实体列表? – 2013-04-24 06:45:03

+1

您必须查询所有实体,并再次保存。 dbindexer应该在保存时修复它。 – dragonx 2013-04-24 14:13:47

+0

完美!非常感谢! – 2013-04-25 05:26:09

相关问题