Как создать QuerySet в Django, чтобы увидеть, является ли имя в базе данных подстрокой моей строки запроса? - PullRequest
1 голос
/ 06 марта 2019

Как упоминается в заголовке, я работаю в Django и пытаюсь создать QuerySet, чтобы он возвращал все модели "Customer", которые имеют имя, являющееся подстрокой моей строки запроса.

Я хочу что-то вроде этого:

Customer.objects.filter(firstName__icontains=query_string)

Но в обратном порядке:

Customer.objects.filter(query_string__icontains=firstName)

За исключением того, что, очевидно, не работает.

Я изо всех сил пытаюсь найти какую-либо информацию о том, как мне поступить об этом.

Заранее спасибо.

Редактировать Мой ожидаемый вклад будет на японском языке - Кана и кандзи 101 な 、 カ ナ 、 漢字

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Вы можете определить пользовательский поиск . Ниже приведено описание, специфичное для Postgres:

class LowerContainedBy(Lookup):
    lookup_name = 'icontained_by'

    def as_sql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)
        params = lhs_params + rhs_params
        return f"LOWER({rhs}) LIKE '%%' || LOWER({lhs}) || '%%'", params

CharField.register_lookup(LowerContainedBy)

Тогда вы можете сделать:

Customer.objects.filter(firstName__icontained_by=query_string)
0 голосов
/ 22 марта 2019

Спасибо всем за ответы!Я смог решить свою проблему, построив ответ @ Брэда.

Я использовал его подход к определению пользовательского поиска.Это похоже на его, но я настроил его для MySQL.

class LowerContainedBy(Lookup):
lookup_name = 'icontained_by'

def as_mysql(self, compiler, connection):
    lhs, lhs_params = self.process_lhs(compiler, connection)
    rhs, rhs_params = self.process_rhs(compiler, connection)
    params = lhs_params + rhs_params
    return  "LOWER({0}) LIKE LOWER(CONCAT('%%',{1},'%%'))".format(lhs, rhs), params

Field.register_lookup(LowerContainedBy)

(я также заметил, что в его ответе были перевернуты rhs и lhs, так что имейте это в виду!)

Инаконец, путем реализации нового поиска следующим образом:

searchResults = Customer.objects.filter(firstName__icontained_by=search_string).exclude(contract='').order_by('-dateCreated')
...