Справочник по 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 uses RegisterLookupMixin to give a class the interface to
register lookups on itself or its instances. The two prominent examples are
Field, the base class of all model fields, and
Transform, the base class of all Django transforms.
-
class
lookups.RegisterLookupMixin¶ Миксин, который реализует API поиска в классе.
-
classmethod
register_lookup(lookup, lookup_name=None)¶ Регистрирует новый поиск в классе или экземпляре класса. Например:
DateField.register_lookup(YearExact) User._meta.get_field('date_joined').register_lookup(MonthExact)
will register
YearExactlookup onDateFieldandMonthExactlookup on theUser.date_joined(you can use Field Access API to retrieve a single field instance). It overrides a lookup that already exists with the same name. Lookups registered on field instances take precedence over the lookups registered on classes.lookup_namewill be used for this lookup if provided, otherwiselookup.lookup_namewill be used.
-
get_lookup(lookup_name)¶ Returns the
Lookupnamedlookup_nameregistered in the class or class instance depending on what calls it. The default implementation looks recursively on all parent classes and checks if any has a registered lookup namedlookup_name, returning the first match. Instance lookups would override any class lookups with the samelookup_name.
-
classmethod
Чтобы класс был поиском, он должен следовать 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).
Справочник по 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.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))
…или аннотации:
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 Query Expression API. It may also be a plain value.
-
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(), для правой части.
-