Так что я использую код от ответа WeizhongTu и нашел не столь очевидные ошибки в нем. Когда мы пытаемся использовать как фильтрацию и поиск с помощью этого кода, фильтрация омрачена этой линией:
queryset = self.model.objects.filter(eval(query_condition))
Важно использовать предыдущие результаты ТОЛЬКО. Поэтому вы никогда не должны использовать self.model.objects
для получения набора запросов, но только фильтруйте сам запрос. Например:
def get_search_results(self, request, queryset, search_term):
# search_term is what you input in admin site
# queryset is the list of objects passed to you
# by the previous functions, e. g. filtering
search_term_list = search_term.split(' ') #['apple','bar']
search_columns = ('name','age','address')
# convert to Q(name='apple') | Q(name='bar') | Q(age='apple') | ...
query_condition = ' | '.join(['Q(%s="%s")'%(x,y) for x in search_term_list for y in search_columns])
appended_queryset = queryset.filter(eval(query_condition))
# queryset is search results
queryset, use_distinct = super(PersonAdmin, self).get_search_results(request, queryset, search_term)
queryset |= appended_queryset
return queryset, use_distinct
Просьба уточнить, какое поведение вы бы хотели достичь. Идеально привести пример. –
Я просто добавил пример –
Я обновил свой ответ, вы можете прочитать его и отредактировать, затем попробуйте – WeizhongTu