Справочник по 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) User._meta.get_field("date_joined").register_lookup(MonthExact)зарегистрирует
YearExactпоиск вDateFieldиMonthExactпоиск вUser.date_joined(можно использовать API доступа к полям для получения отдельного экземпляра поля). Он перезаписывает поиск, который уже существует с тем же именем. Поиски, зарегистрированные в экземплярах полей, имеют приоритет над поисками, зарегистрированными в классах.lookup_nameбудет использоваться для этого поиска, если указано, в противном случаеlookup.lookup_nameбудет использоваться.
-
get_lookup(lookup_name) -
Возвращает
Lookupс именемlookup_name, зарегистрированным в классе или экземпляре класса в зависимости от вызвавшего его места. Реализация по умолчанию ищет рекурсивно во всех родительских классах и проверяет, есть ли у кого-либо зарегистрированный поиск с именем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[source] -
Transform— это общий класс для реализации преобразований полей. Яркий пример —__year, который преобразуетDateFieldвIntegerField.Запись для использования
Transformв выражении поиска —<expression>__<transformation>(например,date__year).Этот класс следует API выражений запроса, что подразумевает, что вы можете использовать
<expression>__<transform1>__<transform2>. Это специализированное выражение Func(), которое принимает только один аргумент. Его также можно использовать в правой части фильтра или непосредственно в качестве аннотации.-
bilateral -
Булево значение, указывающее, следует ли применять это преобразование к
lhsиrhs. Двусторонние преобразования будут применяться кrhsв том же порядке, в котором они появляются в выражении поиска. По умолчанию он установлен вFalse. Пример использования см. в Как написать пользовательские поиски.
-
lhs[source] -
Левая часть — то, что преобразуется. Он должен следовать API выражений запроса.
-
lookup_name -
Имя поиска, используемое для его идентификации при анализе выражений запроса. Оно не может содержать строку
"__".
-
output_field -
Определяет класс, который выводит это преобразование. Он должен быть экземпляром
Field. По умолчанию совпадает с егоlhs.output_field.
-
Lookup справочник
-
class Lookup[source] -
Класс
Lookup— это обобщённый класс для реализации поиска. Поиск — это выражение запроса с левой частью,lhs; правой частью,rhs; иlookup_name, используемой для построения булевого сравнения междуlhsиrhs, таких какlhs in rhsилиlhs > rhs.Основной способ использования поиска в выражении —
<lhs>__<lookup_name>=<rhs>. Поиск также можно использовать напрямую в фильтрахQuerySet:Book.objects.filter(LessThan(F("word_count"), 7500))…или в аннотациях:
Book.objects.annotate(is_short_story=LessThan(F("word_count"), 7500))-
lhs -
Левая часть — то, что ищется. Объект обычно следует API выражений запроса. Он также может быть простым значением.
-
rhs -
Правая часть — то, с чем
lhsсравнивается. Это может быть простое значение или нечто, что компилируется в SQL, обычно объектF()илиQuerySet.
-
lookup_name -
Имя этого поиска, используемое для его идентификации при разборе выражений запроса. Оно не может содержать строку
"__".
-
prepare_rhs -
По умолчанию
True. Когдаrhsявляется простым значением,prepare_rhsопределяет, должно ли оно быть подготовлено для использования в качестве параметра в запросе. Для этого вызываетсяlhs.output_field.get_prep_value(), если оно определено, илиrhsоборачивается вValue()в противном случае.
-
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/5.1/ref/models/lookups/