Справочник по 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¶ Миксин, который реализует 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, возвращая первое совпадение.
-
classmethod
Чтобы класс был поиском, он должен следовать 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).
Справочник по 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¶ Имя поиска, используемое для его идентификации при разборе выражений запроса. Он не может содержать строку
"__".
-
Справочник по Lookup¶
-
class
Lookup[исходный код]¶ Lookup- это универсальный класс для реализации поиска. Поиск - это выражение запроса с левой стороныlhs; правой стороныrhs; иlookup_name, которое используется для получения логического сравнения междуlhsиrhs, такого какlhs in rhsилиlhs > rhs.Обозначение для использования поиска в выражении
<lhs>__<lookup_name>=<rhs>.Этот класс действует как выражение запроса, но, поскольку в его конструкции есть
=<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(), для правой части.
-