Справочник по API поиска
В этом документе представлены ссылки на API поиска, API Django для построения 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() expression, которое принимает только один аргумент. Он также может использоваться в правой части фильтра или напрямую в качестве аннотации.-
bilateral -
Булево значение, указывающее, должно ли это преобразование применяться как к
lhs, так и кrhs. Двусторонние преобразования будут применяться кrhsв том же порядке, в котором они появляются в выражении запроса. По умолчанию он установлен вFalse. Пример использования см. в Пользовательские запросы.
-
lhs -
Левая часть — то, что преобразуется. Она должна следовать API выражений запроса.
-
lookup_name -
Имя запроса, используемое для идентификации при разборе выражений запросов. Оно не может содержать строку
"__".
-
output_field -
Определяет класс, выводимый этим преобразованием. Он должен быть экземпляром
Field. По умолчанию совпадает сlhs.output_field.
-
Lookup справочник
-
class Lookup -
A
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) -
Возвращает кортеж
(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 Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.0/ref/models/lookups/