Справочник по 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, базовый класс всех полей моделей, и Aggregate, базовый класс всех агрегатов Django.
-
class lookups.RegisterLookupMixin -
Миксин, который реализует API поиска для класса.
-
classmethod register_lookup(lookup) -
Регистрирует новый тип поиска в классе. Например,
DateField.register_lookup(YearExact)зарегистрирует тип поискаYearExactвDateField. Он перезаписывает уже существующий тип поиска с тем же именем.
-
get_lookup(lookup_name) -
Возвращает
Lookupс именемlookup_name, зарегистрированным в классе. По умолчанию реализация ищет рекурсивно во всех родительских классах и проверяет, есть ли у кого-нибудь зарегистрированный тип поиска с именемlookup_name, возвращая первую найденную запись.
-
get_transform(transform_name) -
Возвращает
Transformс именемtransform_name. По умолчанию реализация ищет рекурсивно во всех родительских классах, чтобы проверить, есть ли у кого-нибудь зарегистрированное преобразование с именемtransform_name, возвращая первую найденную запись.
-
Для того, чтобы класс был типом поиска, он должен следовать API выражений запроса. Lookup и Transform естественно следуют этому API.
API выражений запроса
API выражений запроса — это общий набор методов, которые определяют классы для использования в выражениях запросов для перевода себя в SQL-выражения. Прямые ссылки на поля, агрегаты и Transform являются примерами, которые следуют этому API. Говорят, что класс следует API выражений запроса, когда он реализует следующие методы:
-
as_sql(self, compiler, connection) -
Ответственен за создание строки запроса и параметров для выражения.
compiler— это объектSQLCompiler, который имеет методcompile(), который можно использовать для компиляции других выражений.connection— это соединение, используемое для выполнения запроса.Вызов
expression.as_sql()обычно некорректен — вместо этого следует использоватьcompiler.compile(expression). Методcompiler.compile()позаботится о вызове методов выражения, специфичных для поставщика.
-
as_vendorname(self, 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.
Справочник по преобразованиям
-
class Transform[source] -
Transform— это универсальный класс для реализации преобразований полей. Ярким примером является__year, который преобразуетDateFieldвIntegerField.Нотация для использования
Transformв выражении поиска —<expression>__<transformation>(например,date__year).Этот класс следует API выражений запроса, что подразумевает возможность использования
<expression>__<transform1>__<transform2>.-
bilateral -
Булево значение, указывающее, следует ли применять это преобразование как к
lhs, так и кrhs. Двусторонние преобразования будут применяться кrhsв том же порядке, что и в выражении поиска. По умолчанию он равенFalse. Пример использования см. в Пользовательские типы поиска.
-
lhs -
Левая часть — то, что преобразуется. Оно должно соответствовать API выражений запроса.
-
lookup_name -
Имя типа поиска, используемое для идентификации при разборе выражений запроса. Оно не может содержать строку
"__".
-
output_field -
Определяет класс, который выводит это преобразование. Он должен быть экземпляром
Field. По умолчанию совпадает с егоlhs.output_field.
-
as_sql()[source] -
Для переопределения; вызывает
NotImplementedError.
-
get_lookup(lookup_name) -
То же, что и
get_lookup().
-
get_transform(transform_name) -
То же, что и
get_transform().
-
Справочник по типам поиска
-
class Lookup[source] -
Класс
Lookup— это общий класс для реализации поисковых запросов. Поисковый запрос — это выражение запроса с левой частью,lhs; правой частью,rhs; иlookup_name, который используется для получения булевого сравнения междуlhsиrhs, например,lhs in rhsилиlhs > rhs.Запись для использования поискового запроса в выражении —
<lhs>__<lookup_name>=<rhs>.Этот класс не следует API выражений запроса, поскольку он имеет
=<rhs>при создании: поисковые запросы всегда являются концом выражения запроса.-
lhs -
Левая часть — то, что ищется. Объект должен следовать API выражений запроса.
-
rhs -
Правая часть — то, с чем
lhsсравнивается. Это может быть простое значение или что-то, что компилируется в SQL, обычно объектF()илиQuerySet.
-
lookup_name -
Имя этого поискового запроса, используемое для его идентификации при разборе выражений запроса. Оно не может содержать строку
"__".
-
process_lhs(compiler, connection, lhs=None)[source] -
Возвращает кортеж
(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)[source] -
Ведёт себя аналогично
process_lhs()для правой части.
-
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.8/ref/models/lookups/