Справочник по 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
YearExact
lookup onDateField
andMonthExact
lookup 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_name
will be used for this lookup if provided, otherwiselookup.lookup_name
will be used.
-
get_lookup
(lookup_name)¶ Returns the
Lookup
namedlookup_name
registered 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 inQuerySet
filters: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()
, для правой части.
-