Справочник по API поиска¶
В этом документе есть ссылки на API поиска, API Django для создания предложения WHERE запроса к базе данных. Чтобы узнать, как использовать поиск, см. Выполнение запросов; чтобы узнать, как создавать новые поисковые запросы, см. Custom Lookups.
API поиска состоит из двух компонентов: класс RegisterLookupMixin, который регистрирует поиск, и Query Expression 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. 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)¶
Registers a new lookup in the class. For example
DateField.register_lookup(YearExact)will registerYearExactlookup onDateField. It overrides a lookup that already exists with the same name.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. The default implementation looks recursively on all parent classes and checks if any has a registered lookup namedlookup_name, returning the first match.
Чтобы класс был поисковым, он должен следовать Query Expression API. Lookup и Transform естественным образом следуют этому API.
API выражения запроса¶
API выражений запросов — это общий набор методов, которые классы определяют для использования в выражениях запросов для преобразования себя в выражения SQL. Прямые ссылки на поля, агрегаты и «Преобразование» — это примеры, которые следуют за этим API. Говорят, что класс следует API выражения запроса, когда он реализует следующие методы:
- as_sql(compiler, connection)¶
Создает фрагмент SQL для выражения. Возвращает кортеж
(sql, params), гдеsql— это строка SQL, аparams— это список или кортеж параметров запроса.Компилятор— это объектSQLCompiler, который имеет методcompile(), который можно использовать для компиляции других выражений.Соединение— это соединение, используемое для выполнения запроса.Вызов
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)¶
Должен вернуть поиск с именем «имя_искателя». Например, вернув
self.output_field.get_lookup(lookup_name).
- get_transform(transform_name)¶
Должен вернуть поиск с именем «transform_name». Например, вернув
self.output_field.get_transform(transform_name).
Ссылка Преобразование¶
- class Transform¶
«Transform» — это универсальный класс для реализации преобразований полей. Ярким примером является __year, который преобразует DateField в IntegerField.
Обозначение для использования
Transformв выражении поиска:<expression>__<transformation>(например,date__year).Этот класс соответствует Query Expression API, что подразумевает, что вы можете использовать
<выражение>__<transform1>__<transform2>. Это специализированное выражение Func(), которое принимает только один аргумент. Его также можно использовать в правой части фильтра или непосредственно в качестве аннотации.- bilateral¶
Логическое значение, указывающее, должно ли это преобразование применяться как к lhs, так и к rhs. Двусторонние преобразования будут применены к rhs в том же порядке, в котором они появляются в выражении поиска. По умолчанию установлено значение «False». Пример использования см. в Custom Lookups.
- lhs¶
Левая часть – что трансформируется. Оно должно соответствовать Query Expression API.
- lookup_name¶
Имя поиска, используемое для его идентификации при анализе выражений запроса. Он не может содержать строку
"__".
Справочник Поиск¶
- class Lookup¶
«Lookup» — это универсальный класс для реализации поиска. Поиск — это выражение запроса с левой частью:
lhs; правая часть:rhs; иищу_имя, которое используется для создания логического сравнения междуlhsиrhs, например,lhs в rhsилиlhs > rhs.The notation to use a lookup in an expression is
<lhs>__<lookup_name>=<rhs>.This class acts as a query expression, but, since it has
=<rhs>on its construction, lookups must always be the end of a lookup expression.- lhs¶
The left-hand side - what is being looked up. The object must follow the Query Expression API.
- rhs¶
Правая часть — с чем сравнивается «левая сторона». Это может быть простое значение или что-то, что компилируется в SQL, обычно это объект
F()илиQuerySet.
- lookup_name¶
Имя этого поиска, используемое для его идентификации при анализе выражений запроса. Он не может содержать строку
"__".
- process_lhs(compiler, connection, lhs=None)¶
Возвращает кортеж
(lhs_string, lhs_params), возвращенныйcompiler.compile(lhs). Этот метод можно переопределить, чтобы настроить обработку lhs.компилятор— это объектSQLCompiler, который можно использовать какcompiler.compile(lhs)для компиляцииlhs.Соединениеможет использоваться для компиляции SQL, специфичного для конкретного поставщика. Еслиlhsне равенNone, используйте его как обработанныйlhsвместоself.lhs.
- process_rhs(compiler, connection)¶
В правой части ведет себя так же, как
process_lhs().