поиск администратора django с несколькими словами
У меня проблемы с использованием search_fields
, когда выражение поиска содержит несколько слов, и я хочу выполнить startswith search
У меня есть класс
class Foo(models.Model):
kw = models.CharField(max_length = 255)
...
class FooAdmin(admin.ModelAdmin):
search_fields = ('^kw',)
'^'
указывает, что я хочу выполнить поиск startswith. Если я ищу kw 'foo fuu', django выполнит запрос:
select * from app_foo where `foo`.`kw` like 'foo%' and `foo`.`kw` like 'fuu%'
Этот запрос, очевидно, дает нулевые результаты. Что я должен сделать, чтобы заставить двигатель искать 'foo fuu%'
?
3 ответа:
Как насчет переопределения
self.query
, так чтоsplit()
не работает?class UnsplitableUnicode(unicode): "An object that behaves like a unicode string but cannot be split()" def split(self, *args, **kwargs): return [self] class MultiWordSearchChangeList(ChangeList): "Changelist that allows searches to contain spaces" def get_query_set(self, request): self.query = UnsplitableUnicode(self.query) return super(MultiWordSearchChangeList, self).get_query_set(request) class FooAdmin(admin.ModelAdmin): def get_changelist(self, request, **kwargs): return MultiWordSearchChangeList
Как упоминал тайский Тран, это немного грязно. Вот раздел, который вам придется отредактировать.
from django.contrib import admin from django.contrib.admin.views.main import ChangeList class CustomChangeList(ChangeList): def get_query_set(self, request): #Basically copy and paste in entire function and edit the piece copied in here. if self.search_fields and self.query: orm_lookups = [construct_search(str(search_field)) for search_field in self.search_fields] for bit in self.query.split(): or_queries = [models.Q(**{orm_lookup: bit}) for orm_lookup in orm_lookups] qs = qs.filter(reduce(operator.or_, or_queries)) if not use_distinct: for search_spec in orm_lookups: if lookup_needs_distinct(self.lookup_opts, search_spec): use_distinct = True break class FooAdmin(admin.ModelAdmin): def get_changelist(self, request, **kwargs): return CustomChangeList
Исходя из опыта, переопределение списка изменений вызвало проблемы в будущем.