Справочник по 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
Lookupis a generic class to implement lookups. A lookup is a query expression with a left-hand side,lhs; a right-hand side,rhs; and alookup_namethat is used to produce a boolean comparison betweenlhsandrhssuch aslhs in rhsorlhs > rhs.The notation to use a lookup in an expression is
<lhs>__<lookup_name>=<rhs>.This class acts as a query expression, but, since it has
=<rhs>on its construction, lookups must always be the end of a lookup expression.-
lhs -
The left-hand side — what is being looked up. The object must follow the API выражений запроса.
-
rhs -
The right-hand side — what
lhsis being compared against. It can be a plain value, or something that compiles into SQL, typically anF()object or aQuerySet.
-
lookup_name -
The name of this lookup, used to identify it on parsing query expressions. It cannot contain the string
"__".
-
process_lhs(compiler, connection, lhs=None) -
Returns a tuple
(lhs_string, lhs_params), as returned bycompiler.compile(lhs). This method can be overridden to tune how thelhsis processed.compileris anSQLCompilerobject, to be used likecompiler.compile(lhs)for compilinglhs. Theconnectioncan be used for compiling vendor specific SQL. Iflhsis notNone, use it as the processedlhsinstead ofself.lhs.
-
process_rhs(compiler, connection) -
Behaves the same way as
process_lhs(), for the right-hand side.
-
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.2/ref/models/lookups/