Горячо добавить возможность поиска в UserProfile в UserAdmin в Django | search_fields с внешним ключом

Я использую управление пользователями Django в сочетании с профилями пользователей, которые связаны с моделью пользователя с помощью ForeignKeys. Теперь я хотел бы сделать поля из профилей пользователей доступными для поиска из UserAdmin.

Мое лучшее предположение состояло в том, чтобы использовать что-то вроде этого:

class UserAdmin(auth.admin.UserAdmin):

    def field_name(self, obj):
        return obj.get_profile().name

    list_display = ('field_name',)

    search_fields = ('field_name',)

В то время как list_display работает нормально, search_fields выдает мне сообщение об ошибке при отправке запроса: Не удается преобразовать ключевое слово 'field_name' в поле. Возможные варианты: [...]

У вас есть какие-либо идеи о том, как это сделать? Заранее спасибо.


person jnns    schedule 27.11.2009    source источник


Ответы (1)


Вы можете использовать нотацию набора запросов с двойным подчеркиванием __ для обозначения соединений, например.

 search_fields = ('company_name','user__username')

http://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

для большего

person michael    schedule 27.11.2009
comment
Настоящая проблема заключается в том, что таблица auth_user не имеет внешнего ключа к модели профиля, а наоборот. Единственным соединением в пользовательской модели является метод .get_profile(), к которому нельзя получить доступ с помощью двойного подчеркивания, потому что это метод, а не поле. - person jnns; 27.11.2009
comment
Извините, обратные отношения могут работать. что-то вроде profile__name или profile__name__contains в зависимости от вашей схемы. Хорошо дразнить эти вещи в ipython. Это будет User.objects.filter(what__you__want='foo'). вы можете опубликовать свою модель профиля, если у вас все еще есть проблемы - person michael; 28.11.2009
comment
Спасибо, Майкл. Обратные отношения сделали свое дело. Я не знаю, почему я еще не получил это из вашей ссылки на документы django. Может быть, я просто слишком устал, чтобы ясно мыслить. - person jnns; 28.11.2009