Справочник 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) 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.
Была добавлена поддержка регистрации поисков для экземпляров Field.
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 -
А
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) -
Возвращает кортеж
(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/5.0/ref/models/lookups/