Поиск выражений ссылки 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 поиска для класса.

classmethodregister_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 , и возвращает первое, с чем встречается.

Чтобы класс считался поисковым, он должен соответствовать 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() where nomfournisseur - имя поставщика базы данных, используемого для выполнения запроса. Для двигателей , поставляемых с 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) .

output_field

Определяет тип класса, возвращаемого методом get_lookup() . Это должен быть экземпляр Field .

Ссылка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

Имя преобразования, используемое для его идентификации при синтаксическом анализе поисковых выражений. Он не может содержать строку "__" .

output_field

Определяет класс, создаваемый этим преобразованием. Это должен быть экземпляр Field . По умолчанию это тот же класс, что и lhs.output_field .

Ссылка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() , но с правой стороны.

Copyright ©2021 All rights reserved