Gegevens filteren en sorteren
U kunt de volgende methoden gebruiken om gegevens te filteren (SQL WHERE-clausule).
-
filter(*args, **kwargs) -> QuerySet -
exclude(*args, **kwargs) -> QuerySet -
Krijgen (*Args,*\ * kwargs) - > model
-
get_or_none(*args, **kwargs) -> Optional[Model] -
get_or_create(_defaults: Optional[Dict[str, Any]] = None, *args, **kwargs) -> Tuple[Model, bool] -
all(*args, **kwargs) -> List[Optional[Model]] -
Query instellen Agent
QuerysetProxy.filter(*args, **kwargs)werkwijzeQuerysetProxy.exclude(*args, **kwargs)werkwijzeQuerysetProxy.get(*args, **kwargs)werkwijzeQuerysetProxy.get_or_none(*args, **kwargs)werkwijzeQuerysetProxy.get_or_create(_defaults: Optional[Dict[str, Any]] = None, *args, **kwargs)werkwijzeQuerysetProxy.all(*args, **kwargs)werkwijze
En sorteer de gegevens met behulp van de volgende methode (SQL-volgorde per clausule).
order_by(columns:Union[List, str, OrderAction]) -> QuerySet- Query instellen Agent
QuerysetProxy.order_by(columns:Union[List, str, OrderAction])werkwijze
filter
filter
filter(*args, **kwargs) -> QuerySet
Hiermee kunt u filteren op elk modelkenmerk / veld en instanties verkrijgen met filters over FK-relaties.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Filters in Django-stijl
U kunt een speciaal filterachtervoegsel gebruiken om de filteroperanden te wijzigen:
- exact - exacte overeenkomst met waarde, sql column =
\ * kan worden geschreven als album\ __name_\ _ exact = 'Malibus' - iexact - exacte overeenkomst sql kolom =
(hoofdletterongevoelig) - kan geschreven worden als album\ __naam_\ _ iexact = 'malibus'
- bevat - sql kolom LIKE '%
%'\ * kan worden geschreven als album\ __naam_\ _ bevat = 'Man' - icontains - sql column LIKE '%
%' (hoofdletterongevoelig)\ * kan worden geschreven als album\ __name_\ _ icontains = 'mal' - in -sql
column IN (<VALUE1>, <VALUE2>, ...)\ * kan geschreven worden alsalbum__name__in=['Malibu', 'Barclay'] - Isnull - sql kolom IS NULL (en sql kolom IS NIET NULL)
- kan worden geschreven als album\ __naam__isnull = True (isnotnull album__naam_\ _ isnull = False)
- gt - sql kolom >
(groter dan)\ * kan worden geschreven als positie\ _\ _ gt = 3 - gte - sql kolom > =
(groter dan of gelijk aan)\ * kan worden geschreven als positie\ _\ _ gte = 3 - lt - sql kolom <
(hieronder)\ * kan worden geschreven als positie\ _\ _ lt = 3 - lte - sql kolom < =
(kleiner dan of gelijk aan)\ * kan worden geschreven als positie\ _\ _ lte = 3 - startswith - sql column LIKE '
%' (exacte start overeenkomst)\ * kan worden geschreven als album\ __name_\ _ startswith = 'Man' - istartswith - sql column LIKE '
%' (hoofdletterongevoelig)\ * kan worden geschreven als album__name__istartswith='mal' - Eindigt met - sql kolom LIKE '%
'(exacte eindmatch)\ * kan worden geschreven als album\ __Naam_\ _ eindigt met = 'ibus' - iendswith - sql kolom LIKE '%
' (hoofdletterongevoelig)\ * kan worden geschreven als album\ __name_\ _ iendswith = 'IBU'
Enkele voorbeelden:
1 2 3 4 5 6 7 8 9 10 11 | |
Python-achtige filters
- Exact - exacte overeenkomst met waarde, sql kolom =
- Kan geschreven worden als Track.album.name = = 'Malibu
- iexact - exacte overeenkomst sql kolom =
(hoofdletterongevoelig) - Kan geschreven worden als
Track.album.name.iexact('malibu')
- Kan geschreven worden als
- bevat - sql kolom LIKE '%
%'*kan geschreven worden als Track.album.name% 'Mal')*kan geschreven worden als Track.album.name.contains('Mal') - icontains - sql kolom LIKE '%
%' (hoofdletterongevoelig)\ * kan worden geschreven als Track.album.name.icontains('mal') - in -sql
column IN (<VALUE1>, <VALUE2>, ...)*kan worden geschreven alsTrack.album.name << ['Malibu', 'Barclay']*kan worden geschreven alsTrack.album.name.in_(['Malibu', 'Barclay']) - isnull - sql column IS NULL (en sql column IS NOT NULL)*kan worden geschreven als Track.album.name > > Geen*kan worden geschreven als Track.album.name isnull (True)*kan worden geschreven als
Niet null als
Track.album.name.isnull(False)*niet null kan worden geschreven als ~ (Track.album.name > > None)\ * niet null kan worden geschreven als~(Track.album.name.isnull(True)) - gt - sql column >
(groter dan)\ * kan worden geschreven als Track.album.name > 3 - gte - sql column > =
(groter dan of gelijk aan)\ * kan worden geschreven als Track.album.name > = 3 - lt - sql kolom <
(hieronder)\ * kan worden geschreven als Track.album.name < 3 - lte - sql kolom < =
(kleiner dan of gelijk aan)\ * kan worden geschreven als Track.album.name < = 3 - startswith - sql column LIKE '
%' (exacte start overeenkomst)\ * kan worden geschreven als Track.album.name.startswith('Mal') - istartswith - sql column LIKE '
%' (hoofdletterongevoelig)\ * kan worden geschreven als Track.album.name.istartswith('mal') - eindigt met - sql kolom LIKE '%
' (exacte eindovereenkomst)\ * kan worden geschreven als Track.album.name.endswith('ibu') - iendswith - sql kolom LIKE '%
' (hoofdletterongevoelig)\ * kan worden geschreven als Track.album.name.iendswith('IBU')
Enkele voorbeelden:
1 2 3 4 5 6 7 8 9 10 11 | |
!!!Merk op dat alle methoden die geen rijen retourneren expliciet een QuerySet-instantie retourneren, zodat u ze aan elkaar kunt koppelen
1 2 3 | |
!!!Waarschuwing, merk op dat u geen% wildcard hoeft op te geven in bevat en andere filters, het wordt voor u toegevoegd. Als u% opneemt in de zoekwaarde, wordt het ontsnapt en behandeld als een letterlijk procentteken binnen de tekst.
uitsluiten
exclude(*args, **kwargs) -> QuerySet
Het werkt exact hetzelfde als het filter, en alle modifiers (achtervoegsels) zijn hetzelfde, maar de niet-voorwaarde wordt geretourneerd.
Dus als je filter (name = 'John') gebruikt, wat gelijk is aan where name = 'John' in SQL, dan is behalve (name = 'John') gelijk aan where name < > 'John'.
Houd er rekening mee dat alle voorwaarden zijn samengevoegd, dus als u meerdere waarden doorgeeft, wordt dit de vereniging van de voorwaarden.
Uitsluiting (naam = 'John', leeftijd > = 35) wordt where not (name='John' and age>=35)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Complexe filters (inclusief OK)
Standaard combineren zowel de filter () als de behalve () -methode de meegeleverde filteropties met een AND-voorwaarde, zodat filter(name="John", age__gt=30) zich vertaalt naar WHERE name = 'John' AND age > 30.
Soms is het handig om een database te bevragen met behulp van voorwaarden die niet gezamenlijk toegepast moeten worden, zoals WHERE name = 'John' OR age > 30, of om een complex waar query te bouwen waar je meer controle over wilt. Immers,WHERE (name = 'John' OR age > 30) and city='New York' is totaal anders dan WHERE name = 'John' OR (age > 30 and city='New York').
Om OR en geneste condities te bouwen, biedt Ormar twee functies die kunnen worden gebruikt in filter () en behalve () in QuerySet en QuerysetProxy.
!!!Merk op dat u deze methoden kunt aanbieden in elke andere methode die\ * args accepteert, zoals get () of all ().
Oproepen naar of_en_kunnen in elkaar worden genest of worden gecombineerd met zoekwoordargumenten. Omdat het ingewikkelder klinkt dan het in werkelijkheid is, laten we enkele voorbeelden bekijken.
Gezien een voorbeeld model als dit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Laten we enkele voorbeeldgegevens maken:
1 2 3 4 5 6 7 | |
We kunnen enkele voorbeeld complexe queries bouwen:
Laten we de boeken of boeken van Tolkien kiezen die na 1970 zijn geschreven
SQL: WHERE ( authors.name = 'J.R.R. Tolkien' OR books.year > 1970 )
Django stijl
1 2 3 4 5 6 | |
Python-stijl
1 2 3 4 5 6 | |
Laten we nu boeken kiezen die Tolkien na 1960 of vóór 1940 heeft geschreven.
SQL: WHERE ( books.year > 1960 OR books.year < 1940 ) AND authors.name = 'J.R.R. Tolkien'
Django stijl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
Python-stijl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Sapkowski 's boeken voor 2000 of Tolkiens boeken na 1960
SQL: WHERE ( ( books.year > 1960 AND authors.name = 'J.R.R. Tolkien' ) OR ( books.year < 2000 AND authors.name = 'Andrzej Sapkowski' ) )
Django stijl
1 2 3 4 5 6 7 8 9 10 11 | |
Python-stijl
1 2 3 4 5 6 7 8 9 | |
Natuurlijk kunnen deze functies meer dan twee voorwaarden hebben, dus als we boeken willen die "hobbit" bevatten:
SQL: WHERE ( ( books.year > 1960 AND authors.name = 'J.R.R. Tolkien' ) OR ( books.year < 2000 AND os0cec_authors.name = 'Andrzej Sapkowski' ) OR books.title LIKE '%hobbit%' )
Django stijl
1 2 3 4 5 6 7 8 9 10 11 | |
Python-stijl
1 2 3 4 5 6 7 8 9 | |
Als u dat wilt of nodig heeft, kunt u indien nodig diepere voorwaarden stellen, zoals het implementeren van de volgende query:
SQL:
1 2 3 | |
U kunt de query als volgt structureren:
Django stijl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Python-stijl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
U zou nu moeten begrijpen hoe ormar.or_en ormar.and_werken. Natuurlijk kunt u ze koppelen aan een van de andere methoden in de queryset, dus in het voorbeeld kan een volledig geldige query er als volgt uitzien:
1 2 3 4 5 6 7 8 9 10 11 | |
Dit geldt ook voor het koppelen en nestelen in Python-stijl.
Django stijl
Houd er rekening mee dat u met Django-stijl niet meerdere keren hetzelfde zoekwoordargument kunt opgeven, dus het is niet toegestaan om filter(ormar.or_(name='Jack', name='John')) als volgt te bevragen. Als u meerdere waarden voor dezelfde kolom wilt controleren, gebruikt u gewoon de in-operator:filter(name__in=['Jack','John']).
Als slechts één argument wordt doorgegeven aan de functie of_of_, staat het gewoon tussen haakjes en heeft het geen effect op de daadwerkelijke query, dus alle drie de query 's zijn hetzelfde:
1 2 3 | |
!!!Notitie of_ En en_ De query heeft WHERE (title = 'The Hobbit'), maar de haakjes zijn overbodig en hebben geen praktisch effect.
Als je echt twee keer dezelfde veldnaam moet gebruiken, kun je deze functie gebruiken. Onthoud dat je niet twee keer hetzelfde zoekwoordargument aan een functie kunt doorgeven, dus hoe vraag je WHERE (authors.name LIKE '%tolkien%') OR (authors.name LIKE '%sapkowski%')) in het voorbeeld?
Je kunt dit niet doen.
1 2 3 4 5 6 7 8 | |
Maar je kunt dit doen:
1 2 3 4 5 6 7 8 9 | |
Python-stijl
Houd er rekening mee dat u met Python-stijl hetzelfde veld zo vaak als nodig kunt gebruiken.
1 2 3 4 5 6 7 8 | |
krijgen
Krijgen (*Args,*\ * kwargs) - > model
Haalt de eerste rij uit de database die voldoet aan de door kwargs ingestelde voorwaarden.
Bij het doorgeven van args en / of kwargs is dit gelijk aan het aanroepen van filter (*Args,*\ * kwargs) .get () snelkoppeling
!!!Tip Ga voor meer informatie over filters naar Filters.
1 | |
Krijgen of niks
Dit is precies hetzelfde als de hierboven beschreven get, maar als er geen databaserecords worden gevonden die aan de criteria voldoen, wordt None geretourneerd in plaats van dat er een uitzondering wordt gegenereerd.
Verwerven of creëren
get_or_create(_defaults: Optional[Dict[str, Any]] = None, *args, **kwargs) -> Tuple[Model, bool]
Maak en verkrijg een combinatie van methoden.
Bij het passeren van args en / of kwargs komt dit overeen met het aanroepen van een snelkoppeling filter(*args, **kwargs).get_or_create()
!!!Tip Ga voor meer informatie over filters naar Filters.
1 | |
Waarschuwing!!!Wanneer een bepaald item niet bestaat, moet u kwargs doorgeven voor alle vereiste velden van het model, inclusief maar niet beperkt tot de kolom Primaire\ _ sleutel (tenzij deze automatisch wordt verhoogd).
allemaal
all(*args, **kwargs) -> List[Optional["Model"]]
Voor de ingestelde filteroptie retourneert u alle rijen in de database voor het gegeven model.
Bij het doorgeven van kwargs staat het gelijk aan het aanroepen van een snelkoppeling om te filteren (*args,*\ * kwargs) .all ()
!!!Tip Ga voor meer informatie over filters naar Filters.
1 | |
QuerysetProxy methode
Wanneer u rechtstreeks toegang krijgt tot de relevante ManyToMany-velden en ReverseForeignKey, wordt een lijst met gerelateerde modellen geretourneerd.
Maar het toont ook een subset van de QuerySet API, zodat u rechtstreeks vanuit het bovenliggende model kunt filteren, maken, gerelateerde modellen kunt selecteren, enz.
filter
Dezelfde filterfunctie als hierboven, maar u kunt gerelateerde objecten filteren vanaf het andere uiteinde van de relatie.
Ga
uitsluiten
De uitsluitingsfunctie is precies hetzelfde als hierboven, maar stelt u in staat gerelateerde objecten van de andere kant van de relatie te filteren.
Ga
krijgen
Hetzelfde als de get-functie hierboven, maar u kunt gerelateerde objecten uit het andere uiteinde van de relatie filteren.
Ga
Krijgen of niks
Dit is precies hetzelfde als de hierboven beschreven get, maar als er geen databaserecords worden gevonden die aan de criteria voldoen, wordt None geretourneerd in plaats van dat er een uitzondering wordt gegenereerd.
Verwerven of creëren
Precies hetzelfde als de functie get\ _ or\ _ create hierboven, maar u kunt gerelateerde objecten uit het andere uiteinde van de relatie filteren.
Ga
allemaal
Hetzelfde als al het bovenstaande, maar u kunt gerelateerde objecten van de andere kant van de relatie filteren.
Ga
sorteren
Bestel basis
order_by(columns: Union[List, str, OrderAction]) -> QuerySet
Met order\ _ by () kunt u de resultaten in de database sorteren op de velden die u selecteert.
U kunt een tekenreeks voorzien van veldnamen of een lijst met tekenreeksen met verschillende velden.
Sorteren in SQL wordt toegepast in de volgorde van de namen die u opgeeft in volgorde\ _ by.
!!!Tip Standaard, als u geen sortering of expliciet sorteren op alle primaire toetsen
!!!Waarschuwing: als u sorteert op geneste modellen, worden de resulterende rijen niet gesorteerd op het hoofdmodel, anders zal mar deze onderliggende rijen samenvoegen tot één hoofdmodel.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Het gegeven voorbeeldmodel is als volgt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | |
Om te sorteren op hoofdmodelveld, geeft u gewoon de veldnaam op
Django stijl
1 2 3 4 5 6 | |
Python-stijl
1 2 3 4 5 6 | |
Om geneste modellen te sorteren, moet u veldnamen scheiden met dunder '__'.
U kunt alle relatietypes - > ForeignKey, Reverse Virtual FK en ManyToMany velden op deze manier sorteren.
Django stijl
1 2 3 4 | |
Python-stijl
1 2 3 4 | |
Om in aflopende volgorde te sorteren, geeft u een koppelteken op vóór de veldnaam
Django stijl
1 2 3 4 5 6 7 8 | |
Python-stijl
1 2 3 4 5 6 7 8 | |
!!!Merk op dat alle methoden die geen rijen retourneren expliciet een QuerySet-instantie retourneren, zodat u ze aan elkaar kunt koppelen
1 2 3 | |
Standaard sortering in Ormar
Aangezien de volgorde van rijen in de database niet kan worden gegarandeerd, geeft Ormar altijd een order per sql-clausule aan elke (gedeeltelijke) query, ook als u de order niet zelf verstrekt.
Bij het bevragen van een database met een bepaald model worden de modellen standaard in oplopende volgorde gesorteerd op primaire\ _ sleutelkolommen. Als u het standaardgedrag wilt wijzigen, kunt u dit doen door de parameter Orders\ _ by aan ormar\ _ config te leveren.
Tip
Standaard volgen relaties dezelfde volgorde, maar u kunt de volgorde waarin gerelateerde modellen worden geladen tijdens een query wijzigen door de relatie met de orders\ _ by en gerelateerde\ _ orders\ _ by parameters op te geven.
Tip
Order\ _ by-clausules worden in de volgende volgorde toegepast:
- Geef de bestelling expliciet door\ _ door () in de query aan te roepen
- Relaties door orders\ _ door en gerelateerde\ _ orders\ _ door (indien aanwezig)
- Model ormar\ _ config objectorders\ _ door
- De primaire\ _ sleutelkolom van het model in oplopende volgorde (fallback, gebruikt als geen van de bovenstaande is opgegeven)
Pas bestellingen van slechts één bron toe op elk model (zodat u deze altijd in één query kunt overschrijven).
Dit betekent dat als u een expliciete volgorde\ _ by voor het model in de query opgeeft, de relatie en de volgorde van de modelbestelling worden overgeslagen.
Als u relatie één opgeeft, wordt modelbestelling overgeslagen.
Als u tenslotte een model opgeeft, wordt de standaardwaarde voor de primaire\ _ sleutel overgeslagen.
QuerysetProxy methode
Wanneer u rechtstreeks toegang krijgt tot de relevante ManyToMany-velden en ReverseForeignKey, wordt een lijst met gerelateerde modellen geretourneerd.
Maar het toont ook een subset van de QuerySet API, zodat u rechtstreeks vanuit het bovenliggende model kunt filteren, maken, gerelateerde modellen kunt selecteren, enz.
Bestel basis
Precies hetzelfde als de functie order\ _ by hierboven, maar u kunt gerelateerde objecten van de andere kant van de relatie sorteren.
Ga