Функциональность поиска в представлении списка

Я пытаюсь реализовать функцию поиска в представлении списка CBV. Для этого я написал "get_queryset". Представление выглядит следующим образом

class List(ListView):
model = Client
...

def get_queryset(self, *args, **kwargs):
    qs = super().get_queryset(*args, **kwargs)
    query = self.request.GET.get('q')
    if query:
        return qs.get(user=query)
    return qs

Когда у меня так, я получаю следующую ошибку: "Поле 'id' ожидало число, но получило 'x'.". x - это в данном случае то, что я ввел в поле поиска.

Но если я меняю пользователя на что-то недопустимое, я получаю следующую ошибку: "Невозможно преобразовать ключевое слово '' в поле. Возможные варианты: user, user_id".

Я не понимаю, почему user не работает в этом случае и почему он использует поле "id", если я указываю user.

Когда вы используете реляционное поле в поиске по кверисету БЕЗ указания типа поиска (exact/iexact/icontains, etc.), он предполагает, что вы делаете запрос по exact.

Точный реляционный поиск допускает экземпляры, но также будет пытаться использовать ваш параметр в качестве идентификатора.

Похоже, что тип вашего идентификатора пользователя - число/целое число, поэтому вам нужно преобразовать 'query' в целое число.

Если вы хотите запросить что-то вроде имени пользователя, попробуйте qs.filter(user__username__icontains=query)

Вернуться на верх