Поиск выражений ссылки API ¶
Этот документ содержит ссылки на API для поисковых выражений, API Django для создания предложений WHERE
запросов к базе данных. Чтобы узнать, как использовать эти выражения, см. Создание запросов . Чтобы узнать, как создавать новые выражения, см. Выражения пользовательского поиска .
API выражений поиска состоит из двух частей: класса, RegisterLookupMixin
который регистрирует выражения, и API выражений поиска - набора методов, которые класс должен реализовать, чтобы его можно было записать как выражение поиска.
Django имеет два базовых класса, которые соответствуют API выражений поиска и от которых происходят все выражения поиска, предоставляемые Django:
Lookup
: Для поиска поля (например , частьexact
изnom_champ__exact
)Transform
: преобразовать элемент управления
Выражение поиска состоит из трех частей:
- часть полей (например
Livre.objects.filter(auteur__meilleurs_amis__prenom...
); - часть преобразования (может быть опущена) (например
__lower__troispremierscars__reversed
); - часть поиска (например
__icontains
), которая, если не указана, соответствует__exact
.
API регистрации ¶
Django использует RegisterLookupMixin
для предоставления классу интерфейса для регистрации поисков самого себя. Двумя основными примерами являются Field
базовый класс для всех полей модели и Transform
базовый класс для всех преобразований Django.
-
класс
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
, и возвращает первый обнаруженный.
-
get_lookups
() ¶ Возвращает словарь, соответствующий каждому имени запроса, зарегистрированному в классе, с его классом
Lookup
.
-
get_transform
( Transform_name ) ¶ Возвращает
Transform
именованное преобразованиеtransform_name
. Реализация по умолчанию рекурсивно просматривает все родительские классы и проверяет, есть ли в каком-либо из них преобразование, зарегистрированное под этим именемtransform_name
, и возвращает первое, с чем встречается.
-
classmethod
Чтобы класс считался поисковым, он должен соответствовать API выражения поиска . Lookup
и Transform
естественно следовать этому API.
API поисковых выражений ¶
API выражения поиска - это общий набор методов, которые определяют классы, чтобы их можно было использовать в выражениях поиска с возможностью преобразования в выражения SQL. Transform
Примеры, которые следуют за этим API, являются прямыми ссылками на поля, агрегаты и выражения . Говорят, что класс уважает API выражения поиска, когда он реализует следующие методы:
-
as_sql
( компилировать , подключать ) ¶ Создает SQL-фрагмент выражения. Возвращает кортеж , где - строка SQL, а - список или кортеж параметров запроса. это объект с методом, который можно использовать для компиляции других выражений. это соединение, используемое для выполнения запроса.
(sql, params)
sql
params
compiler
SQLCompiler
compile()
connection
Вызывать обычно неправильно
expression.as_sql()
, скорее этоcompiler.compile(expression)
то, что следует использовать. Методcompiler.compile()
заботится о вызове методов, специфичных для поставщика базы данных для данного выражения.Для этого метода могут быть определены настраиваемые именованные параметры, если есть вероятность, что существуют какие-либо методы
as_nomfournisseur()
или подклассы, которые могут захотеть предоставить данные для переопределения генерации строки SQL. См.Func.as_sql()
Пример использования.
-
as_vendorname
( компилировать , подключать ) ¶ Работает как метод
as_sql()
. Когда выражение компилируется с помощьюcompiler.compile()
, Django сначала пытается вызватьas_nomfournisseur()
wherenomfournisseur
- имя поставщика базы данных, используемого для выполнения запроса. Для двигателей , поставляемых с Django,nomfournisseur
может соответствоватьpostgresql
,oracle
,sqlite
илиmysql
.
-
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
-
класс
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
-
класс
Lookup
¶ Lookup
это универсальный класс для реализации поиска. Поиск - это выражение запроса с левойlhs
и правой стороной,rhs
а также имя,lookup_name
используемое для логического сравнения междуlhs
и,rhs
например или .lhs in rhs
lhs > rhs
Обозначения , используемые для размещения поиска
Lookup
в выражении поиска<cote_gauche>__<nom_recherche>=<cote_droit>
.Этот класс не уважает API выражения поиска, потому что
=<rhs>
в его конструкции: поиск всегда находится в конце выражения поиска.-
lhs
¶ Слева - искомый контент. Объект должен соответствовать API выражений поиска .
-
rhs
¶ Правая грань, которую сравнивают с
lhs
. Это может быть необработанное значение или что-то, что компилируется в SQL, обычно объектF()
или файлQuerySet
.
-
lookup_name
¶ Имя поиска, используемое для его идентификации при разборе поисковых фраз. Он не может содержать строку
"__"
.
-
process_lhs
( компиляция , подключение , lhs = Нет ) ¶ Возвращает кортеж , возвращенный . Этот метод можно перегрузить, чтобы уточнить обработку .
(lhs_string, lhs_params)
compiler.compile(lhs)
lhs
compiler
это объектSQLCompiler
для компиляцииlhs
, как и в случае сcompiler.compile(lhs)
. Параметрconnection
может использоваться для компиляции SQL в соответствии с конкретным поставщиком. Еслиlhs
нетNone
, этот параметр используетсяlhs
вместоself.lhs
.
-
process_rhs
( компилировать , подключать ) ¶ Ведет себя так же
process_lhs()
, но с правой стороны.
-