Типы поиска Django ("iexact", "icontains", "month" и т. Д.) Не работают в nonrel Django (с использованием dbindexer)

Я создал приложение, используя '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'

Я создал файл 'dbindexes' внутри папки 'myapp', чтобы добавить определения индекса.

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, используя зарегистрированные индексы, он всегда возвращает пустой список. Кажется, что индексы должным образом обнаруживаются, поскольку это не выдает никакой ошибки. Однако, когда я меняю 'icontains' на 'Содержит' в файле 'myapp / dbindexes.py', это дает ожидаемый результат.

Может ли кто-нибудь помочь мне разобраться в проблеме?

Спасибо!!!

1 ответ

Решение

По сути, dbindexer автоматически денормализует вашу сущность и добавляет дополнительные индексируемые поля для помощи в запросах. Например, GAE не выполняет поиск без учета регистра или поиск по подстроке, поэтому, если вам нужно использовать icontainsон генерирует список строчных подстрок и сохраняет его в ListField, который индексируется. Это происходит, когда вы пишете свою сущность.

Обратите внимание, что это может оказаться очень дорогим, так как это приводит к увеличению вашего хранилища данных и используемых индексов.

Когда вы запускаете запрос, вы можете выполнять запросы только к объектам в хранилище данных. Если ваш dbindexes.py указан contains в какой-то момент, тогда сущности были бы созданы с полями поиска для containsи запросы для icontains не найдет то, что вы ищете. Если вы добавляете новые сущности, и в них записаны правильные индексируемые данные, то они должны быть доступны для запроса, но старые сущности не будут возвращены в запросе.

Вы можете использовать средство просмотра хранилища данных, чтобы увидеть, что dbindexer было написано вместе с вашими сущностями. Если некоторые объекты не имеют дополнительных атрибутов, сгенерированных dbindexer, эти запросы не будут возвращаться. Вы можете исправить это, прочитав и записав все свои сущности, чтобы dbindexer обновил поля.

Другие вопросы по тегам