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

相關問題