Django adminsite настроить запрос search_fields

В django admin вы можете установить поля search_fields для ModelAdmin, чтобы иметь возможность выполнять поиск по свойствам, указанным там. Мой класс модели обладает свойством, которое не является реальным свойством модели, означает, что оно не находится в таблице базы данных. Свойство относится к другой таблице базы данных, которая не привязана к текущей модели через отношения. Но я хочу, чтобы иметь возможность искать по нему, поэтому мне нужно как-то настроить запрос, созданный сайтом администратора, чтобы сделать фильтрацию, когда поле поиска было заполнено - возможно ли это, и если, как? Я могу запросить таблицу базы данных моего настраиваемого свойства, а затем возвращает идентификаторы классов модели, подходящих для поиска. Это, как я уже сказал, должно проникнуть в поисковый запрос администратора.

Спасибо!

Ответ 1

Начиная с django 1.6, вы можете настроить поиск, определив метод get_search_results в своем подклассе ModelAdmin.

Это хорошо объяснено в документации django. Следующий пример копируется из этого документа.

class PersonAdmin(admin.ModelAdmin):
    list_display = ('name', 'age')
    search_fields = ('name',)

    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super(PersonAdmin, self).get_search_results(request, queryset, search_term)
        try:
            search_term_as_int = int(search_term)
            queryset |= self.model.objects.filter(age=search_term_as_int)
        except:
            pass
        return queryset, use_distinct

Ответ 2

Вы должны использовать search_fields = ['foreign_key__related_fieldname'] как search_fields = ['user__email'] в классе admin, который расширяет admin.ModelAdmin

подробнее здесь