2013-11-14 10 views
9

To mnie doprowadza do szału, ale wydaje się, że powinno być proste.Jak mogę odfiltrować obiekt Haystack SearchQuerySet dla Brak na IntegerField

Używam Django i Haystack i mam indeks wyszukiwania, w tym IntegerField, który zezwala na wartość null. Jest to oparte na pokrewnym modelu w Django, ale nie sądzę, aby miało to znaczenie. np:

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

    class Meta: 
     model = Thing 

czasami żeby moje zapytanie Stóg wrócić przedmioty z None/null dla tej dziedzinie, więc jestem filtrowanie w __init__ formularza wyszukiwania, ale nie mogę się zapytanie, aby to zrobić. Najbardziej oczywistym sposobem, jaki próbowałem, było:

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

Ale to nie zwraca żadnych rekordów.

Teraz pracuję wokół niego z tego:

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

Który działa, ale oczywiście nie jest tak jak powinno być zrobione :)

Czy ktoś może pomóc?

Dzięki!

Odpowiedz

5

czuję, że to pytanie nie odpowiedział. Wygląda na to, że op pytał, jak filtrować puste wpisy za pomocą komendy haystack.query.SearchQuerySet z zapleczem ElasticSearch.

W powyższym przykładzie, wymienić

self.searchqueryset.filter(group__isnull=True) 

z

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

Nie intuicyjny, ale jego jedyny sposób mam zdobyć to do pracy do tej pory.

+1

Dzięki za to. Jeśli to możliwe, dodaj źródło tej odpowiedzi. –

11

Jeśli używasz ElasticSearch, rozwiązaniem może być wykonane bez łatania, tylko przy użyciu natywnego ElasticSearch:

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

odwrót, odfiltrować wszystkie dokumenty, które mają zakaz emtpy pole Grupa:

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

Może to również działać w przypadku SOLR oraz w innych systemach zaplecza Haystack stosujących tę samą koncepcję, ale z określoną składnią języka wyszukiwania backendu.

Referencje:

+0

ładne .. tylko jedną rzeczą, którą masz TYPO, powinno być 'self.searchqueryset.exclude (group = Raw (" [* TO *] ")) – psychok7

+0

@ psychok7 Dzięki, naprawione. –

+0

Wydaje się, że działa również dla Solr. – tschale

Powiązane problemy