Справочник по 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(), которое принимает только один аргумент. Его также можно использовать в правой части фильтра или непосредственно как аннотацию.-
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 primary notation to use a lookup in an expression is
<lhs>__<lookup_name>=<rhs>. Lookups can also be used directly inQuerySetfilters:Book.objects.filter(LessThan(F('word_count'), 7500))…or annotations:
Book.objects.annotate(is_short_story=LessThan(F('word_count'), 7500))-
lhs -
The left-hand side - what is being looked up. The object typically follows the Выражение запроса. It may also be a plain value.
-
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 4.0:Добавлена поддержка использования lookups в
QuerySetаннотациях, агрегациях и непосредственно в фильтрах. -
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/4.0/ref/models/lookups/