API-referens för uppslagning¶
Det här dokumentet innehåller API-referenser för lookups, Djangos API för att bygga WHERE-klausulen i en databasfråga. För att lära dig hur du använder lookups, se Göra förfrågningar; för att lära dig hur du skapar nya lookups, se Hur man skriver anpassade uppslagsord.
Lookup API har två komponenter: en RegisterLookupMixin-klass som registrerar lookups, och Query Expression API, en uppsättning metoder som en klass måste implementera för att kunna registreras som en lookup.
Django har två basklasser som följer API:et för frågeuttryck och från vilka alla Djangos inbyggda uppslagsord härleds:
Lookup: för att slå upp ett fält (t.ex.exaktavfield_name__exact)Transform: för att transformera ett fält
Ett lookup-uttryck består av tre delar:
Fältdel (t.ex.
Book.objects.filter(author__best_friends__first_name...);Transformerar del (kan utelämnas) (t.ex.
__lower__first3chars__reversed);En uppslagning (t.ex.
__icontains) som, om den utelämnas, har__exactsom standard.
API för registrering¶
Django använder RegisterLookupMixin för att ge en klass gränssnittet för att registrera lookups på sig själv eller dess instanser. De två mest framträdande exemplen är Field, basklassen för alla modellfält, och Transform, basklassen för alla Django-transformationer.
- class lookups.RegisterLookupMixin¶
En mixin som implementerar API:et för uppslagning i en klass.
- classmethod register_lookup(lookup, lookup_name=None)¶
Registrerar en ny uppslagning i klassen eller klassinstansen. Till exempel:
DateField.register_lookup(YearExact) User._meta.get_field("date_joined").register_lookup(MonthExact)
kommer att registrera
YearExactlookup påDateFieldochMonthExactlookup påUser.date_joined(du kan använda Field Access API för att hämta en enda fältinstans). Den åsidosätter en lookup som redan finns med samma namn. Uppslagningar som registrerats på fältinstanser har företräde framför de uppslagningar som registrerats på klasser.lookup_namekommer att användas för denna lookup om det anges, annars kommerlookup.lookup_nameatt användas.
- get_lookup(lookup_name)¶
Returnerar den
Lookupmed namnetlookup_namesom registrerats i klassen eller klassinstansen beroende på vad som anropar den. Standardimplementeringen tittar rekursivt på alla överordnade klasser och kontrollerar om någon har en registrerad uppslagning med namnetlookup_name, och returnerar den första matchningen. Instansuppslagningar skulle åsidosätta alla klassuppslagningar med sammalookup_name.
- get_lookups()¶
Returnerar en ordbok över varje uppslagsnamn som registrerats i den klass eller klassinstans som mappats till klassen
Lookup.
- get_transform(transform_name)¶
Returnerar en
Transformmed namnettransform_namesom är registrerad i klassen eller klassinstansen. Standardimplementeringen tittar rekursivt på alla överordnade klasser för att kontrollera om någon har den registrerade transformationen med namnettransform_name, och returnerar den första matchningen.
För att en klass ska vara en lookup måste den följa Query Expression API. Lookup och Transform följer naturligtvis detta API.
API för frågeuttryck¶
API:et för frågeuttryck är en gemensam uppsättning metoder som klasser definierar för att kunna användas i frågeuttryck för att översätta dem till SQL-uttryck. Direkta fältreferenser, aggregat och Transform är exempel som följer detta API. En klass sägs följa API:et för frågeuttryck när den implementerar följande metoder:
- as_sql(compiler, connection)¶
Genererar SQL-fragmentet för uttrycket. Returnerar en tupel
(sql, params), därsqlär SQL-strängen ochparamsär listan eller tupeln av frågeparametrar. `` Compiler`` är ettSQLCompiler-objekt, som har encompile()-metod som kan användas för att sammanställa andra uttryck. `` Connection`` är anslutningen som används för att köra frågan.Att anropa
expression.as_sql()är vanligtvis felaktigt - istället börcompiler.compile(expression)användas. Metodencompiler.compile()kommer att ta hand om anrop av leverantörsspecifika metoder för uttrycket.Anpassade nyckelordsargument kan definieras för denna metod om det är troligt att
as_vendorname()-metoder eller underklasser kommer att behöva tillhandahålla data för att åsidosätta genereringen av SQL-strängen. SeFunc.as_sql()för exempel på användning.
- as_vendorname(compiler, connection)¶
Fungerar som metoden
as_sql(). När ett uttryck kompileras avcompiler.compile(), kommer Django först att försöka anropaas_vendorname(), därvendornameär leverantörsnamnet på den backend som används för att utföra frågan.vendornameär ett avpostgresql,oracle,sqliteellermysqlför Djangos inbyggda backends.
- get_lookup(lookup_name)¶
Måste returnera lookupen med namnet
lookup_name. Till exempel: genom att returneraself.output_field.get_lookup(lookup_name).
- get_transform(transform_name)¶
Måste returnera uppslagningen med namnet
transform_name. Till exempel: genom att returneraself.output_field.get_transform(transform_name).
Transform referens¶
- class Transform[source]¶
En
Transformär en generisk klass för att implementera fälttransformationer. Ett framträdande exempel är__yearsom omvandlar enDateFieldtill enIntegerField.Notationen för att använda en
Transformi ett lookup-uttryck är<expression>__<transformation>(t.ex.date__year).Den här klassen följer Query Expression API, vilket innebär att du kan använda
<expression>__<transform1>__<transform2>. Det är ett specialiserat Func()-uttryck som bara accepterar ett argument. Det kan också användas på höger sida av ett filter eller direkt som en annotation.- bilateral¶
En boolean som anger om denna transformation ska tillämpas på både
lhsochrhs. Bilaterala transformationer kommer att tillämpas pårhsi samma ordning som de förekommer i uppslagsuttrycket. Som standard är den inställd påFalse. För exempel på användning, se Hur man skriver anpassade uppslagsord.
- lhs[source]¶
Den vänstra sidan - det som transformeras. Det måste följa Query Expression API.
- lookup_name¶
Namnet på uppslagsobjektet, som används för att identifiera det vid analys av frågeuttryck. Det kan inte innehålla strängen
"__".
Lookup referens¶
- class Lookup[source]¶
En
Lookupär en generisk klass för att implementera uppslagningar. En lookup är ett frågeuttryck med en vänstersida,lhs; en högersida,rhs; och ettlookup_namesom används för att producera en boolesk jämförelse mellanlhsochrhssåsomlhs in rhsellerlhs > rhs.Den primära notationen för att använda en lookup i ett uttryck är
<lhs>__<lookup_name>=<rhs>. Lookups kan också användas direkt iQuerySet-filter:Book.objects.filter(LessThan(F("word_count"), 7500))
…eller anteckningar:
Book.objects.annotate(is_short_story=LessThan(F("word_count"), 7500))
- lhs¶
Den vänstra sidan - det som söks upp. Objektet följer vanligtvis Query Expression API. Det kan också vara ett vanligt värde.
- rhs¶
Den högra sidan - det som
lhsjämförs med. Det kan vara ett vanligt värde eller något som kompileras till SQL, vanligtvis ettF()-objekt eller enQuerySet.
- lookup_name¶
Namnet på den här uppslagningen, som används för att identifiera den vid analys av frågeuttryck. Det kan inte innehålla strängen
"__".
- prepare_rhs¶
Standardvärdet är
True. Närrhsär ett vanligt värde avgörprepare_rhsom det ska förberedas för att användas som en parameter i en fråga. För att göra detta anropaslhs.output_field.get_prep_value()om det är definierat, eller så omslutsrhsavValue()annars.
- process_lhs(compiler, connection, lhs=None)[source]¶
Returnerar en tupel
(lhs_string, lhs_params), som returneras avcompiler.compile(lhs). Denna metod kan åsidosättas för att ställa in hurlhsbearbetas.compilerär ettSQLCompilerobjekt, som ska användas somcompiler.compile(lhs)för att sammanställalhs.connectionkan användas för att sammanställa leverantörsspecifik SQL. Omlhsinte ärNone, använd den som den bearbetadelhsistället förself.lhs.
- process_rhs(compiler, connection)[source]¶
Uppträder på samma sätt som
process_lhs(), för den högra sidan.