2013-11-14 5 views
9

Это меня немного смущает, но похоже, что это должно быть просто.Как фильтровать Haystack SearchQuerySet для None на IntegerField

Я использую Django и Haystack и имею индекс поиска, включающий IntegerField, который допускает null. Это основано на родственной модели в Django, но я не думаю, что это имеет значение. например:

class ThingIndex(indexes.ModelSearchIndex, indexes.Indexable): 
    group = indexes.IntegerField(model_attr='group__id', null=True) 

    class Meta: 
     model = Thing 

Я иногда хочу, чтобы мой Стог запрос, чтобы возвратить детали с None/Null для этой области, поэтому я фильтрации в __init__ формы поиска, но я не могу получить запрос, чтобы сделать это. Наиболее очевидным способом я пытался:

self.searchqueryset.filter(group__isnull=True) # how to do it on a regular Django queryset 

Но это не возвращает никаких записей.

Сейчас я работаю вокруг него с этим:

self.searchqueryset.exclude(group__in=range(1,100)) 

Который работает, но, очевидно, не так, как это должно быть сделано :)

Может кто-нибудь помочь?

Спасибо!

ответ

5

Я чувствую этот вопрос не ответил. Кажется, что op спрашивал, как фильтровать нулевые записи, используя haystack.query.SearchQuerySet с бэкэндом ElasticSearch.

В приведенном выше примере, замените

self.searchqueryset.filter(group__isnull=True) 

с

self.searchqueryset.filter(_missing_='group') 

не интуитивно, но его единственный способ, который я получил эту работу до сих пор.

+1

Спасибо за это. Если возможно, добавьте источник для ответа. –

3

Если вы используете Solr, вы, вероятно, хотели бы взглянуть на следующие ссылки:

1) https://github.com/toastdriven/django-haystack/commit/9332a91a7f0e4b33d7e20aa892d156305c12dfe3
2) https://github.com/toastdriven/django-haystack/issues/163

Там в патч для ГУМЗ, позволяя такие запросов, но для других бэкэндов, вероятно, нет.

+0

Спасибо! Действительно полезно. Не используя SOLR, мы используем ElasticSearch. Ну что ж. – Ludo

11

Если вы используете ElasticSearch, решение может быть сделано без заплат, используя только родную ElasticSearch:

from haystack.inputs import Raw 
self.searchqueryset.exclude(group = Raw("[* TO *]")) 

Другого путь вокруг, фильтровать все документы, которые, не пусто поле группы:

from haystack.inputs import Raw 
self.searchqueryset.filter(group = Raw("[* TO *]")) 

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

Ссылки:

+0

nice .. только одна вещь у вас есть TYPO, это должно быть 'self.searchqueryset.exclude (group = Raw (" [* TO *] "))' – psychok7

+0

@ psychok7 Спасибо, исправлено. –

+0

Кажется, работает для Solr тоже – tschale

Смежные вопросы