Справочник по API поиска
В этом документе содержатся ссылки на API для поиска, Django API для построения WHERE части запроса к базе данных. Чтобы узнать, как использовать поиск, см. Создание запросов; чтобы узнать, как создать новые поиски, см. Как написать пользовательский поиск.
API поиска состоит из двух компонентов: класса RegisterLookupMixin, который регистрирует поиски, и API выражений запроса, набора методов, которые класс должен реализовать, чтобы быть зарегистрированным в качестве поиска.
Django имеет два базовых класса, которые следуют API выражений запроса и от которых происходит все встроенные поиски Django:
Выражение поиска состоит из трёх частей:
- Часть поля (например,
Book.objects.filter(author__best_friends__first_name...); - Часть преобразований (может быть опущена) (например,
__lower__first3chars__reversed); - Поиск (например,
__icontains) который, если опущен, по умолчанию равен__exact.
API регистрации
Django использует RegisterLookupMixin для предоставления классу интерфейса для регистрации поисков в нём. Два наиболее важных примера — Field, базовый класс всех полей модели, и Transform, базовый класс всех преобразований Django.
-
class lookups.RegisterLookupMixin -
Mixin, реализующий API поиска для класса.
-
classmethod register_lookup(lookup, lookup_name=None) -
Регистрирует новый поиск в классе. Например,
DateField.register_lookup(YearExact)зарегистрирует поискYearExactвDateField. Он перезаписывает поиск, который уже существует с тем же именем.lookup_nameбудет использоваться для этого поиска, если он предоставлен, в противном случае будет использоватьсяlookup.lookup_name.
-
get_lookup(lookup_name) -
Возвращает
Lookupс именемlookup_name, зарегистрированный в классе. Реализация по умолчанию выполняет рекурсивный поиск по всем родительским классам и проверяет, имеет ли какой-либо из них зарегистрированный поиск с именемlookup_name, возвращая первый результат совпадения.
-
get_lookups() -
Возвращает словарь, где каждое имя поиска сопоставлено классу
Lookup.
-
get_transform(transform_name) -
Возвращает
Transformс именемtransform_name. Реализация по умолчанию выполняет рекурсивный поиск по всем родительским классам для проверки, имеет ли какой-либо из них зарегистрированное преобразование с именемtransform_name, возвращая первое совпадение.
-
Для того, чтобы класс был поиском, он должен следовать API выражений запроса. Lookup и Transform естественным образом следуют этому API.
API выражений запроса
API выражений запроса представляет собой общий набор методов, которые определяются классами для использования в выражениях запросов для перевода самих себя в выражения SQL. Прямые ссылки на поля, агрегаты и Transform — это примеры, которые следуют этому API. Говорят, что класс следует API выражений запроса, когда он реализует следующие методы:
-
as_sql(compiler, connection) -
Создаёт фрагмент SQL для выражения. Возвращает кортеж
(sql, params), гдеsql— строка SQL, аparams— список или кортеж параметров запроса.compiler— это объектSQLCompiler, у которого есть методcompile(), который можно использовать для компиляции других выражений.connection— это соединение, используемое для выполнения запроса.Вызов
expression.as_sql()обычно некорректен — вместо этого следует использоватьcompiler.compile(expression). Методcompiler.compile()позаботится о вызове методов, специфичных для поставщика, выражения.В этом методе могут быть определены пользовательские ключевые аргументы, если существует вероятность того, что методы
as_vendorname()или подклассы потребуют предоставления данных для переопределения генерации строки SQL. См.Func.as_sql()для примера использования.
-
as_vendorname(compiler, connection) -
Работает как метод
as_sql(). Когда выражение компилируется с помощьюcompiler.compile(), Django сначала попытается вызватьas_vendorname(), гдеvendorname— имя поставщика бэкенда, используемого для выполнения запроса.vendorname— это одно из значенийpostgresql,oracle,sqlite, илиmysqlдля встроенных бэкендов Django.
-
get_lookup(lookup_name) -
Должен вернуть поиск с именем
lookup_name. Например, вернувself.output_field.get_lookup(lookup_name).
-
get_transform(transform_name) -
Должен вернуть поиск с именем
transform_name. Например, вернувself.output_field.get_transform(transform_name).
-
output_field -
Определяет тип класса, возвращаемого методом
get_lookup(). Он должен быть экземпляромField.
Transform справочник
-
class Transform -
Transform— это обобщённый класс для реализации преобразований полей. Ярким примером является__year, преобразующийDateFieldвIntegerField.Запись для использования
Transformв выражении поиска —<expression>__<transformation>(например,date__year).Этот класс следует API выражений запроса, что подразумевает, что вы можете использовать
<expression>__<transform1>__<transform2>. Это специализированное выражение Func(), которое принимает только один аргумент. Его также можно использовать в правой части фильтра или непосредственно в качестве аннотации.-
bilateral -
Булево значение, указывающее, должно ли это преобразование применяться как к
lhs, так и кrhs. Двусторонние преобразования будут применяться кrhsв том же порядке, что и в выражении поиска. По умолчанию он установлен вFalse. Пример использования см. в Как написать пользовательский поиск.
-
lhs -
Левая часть — то, что преобразуется. Оно должно соответствовать API выражений запроса.
-
lookup_name -
Имя поиска, используемое для идентификации при парсинге выражений запросов. Оно не может содержать строку
"__".
-
output_field -
Определяет класс, который выводит это преобразование. Он должен быть экземпляром
Field. По умолчанию совпадает сlhs.output_field.
-
Lookup справочник
-
class Lookup -
A
Lookup— это общий класс для реализации поисковых запросов. Поисковый запрос — это выражение запроса с левой частью,lhs; правой частью,rhs; и оператором, который используется для получения булевого сравнения междуlhsиrhs, например,lhs in rhsилиlhs > rhs.Основной способ использования поискового запроса в выражении —
<lhs>__<lookup_name>=<rhs>. Поисковые запросы также могут быть использованы непосредственно в фильтрахQuerySet:Book.objects.filter(LessThan(F('word_count'), 7500))…или в аннотациях:
Book.objects.annotate(is_short_story=LessThan(F('word_count'), 7500))-
lhs -
Левая часть — то, что ищется. Объект, как правило, следует за API выражений запросов. Он также может быть простым значением.
-
rhs -
Правая часть — то, с чем
lhsсравнивается. Это может быть простое значение или что-то, что компилируется в SQL, обычно объектF()илиQuerySet.
-
lookup_name -
Имя этого поискового запроса, используемое для его идентификации при разборе выражений запросов. Оно не может содержать строку
"__".
-
process_lhs(compiler, connection, lhs=None) -
Возвращает кортеж
(lhs_string, lhs_params), как возвращаетcompiler.compile(lhs). Этот метод может быть переопределён для настройки обработкиlhs.compiler— это объектSQLCompiler, который используется какcompiler.compile(lhs)для компиляцииlhs.connectionможет использоваться для компиляции поставщика SQL. ЕслиlhsнеNone, используйте его как обработаннуюlhsвместоself.lhs.
-
process_rhs(compiler, connection) -
Ведёт себя так же, как
process_lhs(), для правой части.
Изменено в Django 4.0:Добавлена поддержка использования поисковых запросов в аннотациях, агрегациях
QuerySetи напрямую в фильтрах. -
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/4.1/ref/models/lookups/