Ga naar inhoud

Query instellen Agent

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.

!!!Merk op dat de openbare QuerySet standaard is gefilterd om alleen modellen met betrekking tot het bovenliggende model te retourneren.

1
Dus als je `post.categories.all()` geeft, krijg je alle categorieën die verband houden met dat bericht, niet allemaal in de tabel.

!!!Merk op dat wanneer u toegang krijgt tot QuerySet API-methoden via QuerysetProxy, u geen objecteigenschappen hoeft te gebruiken zoals een normale query.

1
2
3
Merk dus op dat het `post.categories.all()` en**is en niet**`post.categories.objects.all()`.

Ga voor meer informatie over de beschikbare QuerySet-methoden naar [-zoekopdrachten][queries]

!!!Waarschuwing Querying-gerelateerde modellen van ManyToMany wist de lijst met gerelateerde modellen die op het bovenliggende model zijn geladen:

1
2
3
4
5
6
7
8
9
Voorbeeld:`post.categories.first()` zal post.categorieën instellen op een lijst van 1 gerelateerde modellen - > degene die als eerste is geretourneerd ()

Voorbeeld 2: als het bericht 4 categorieën heeft, dus `len(post.categories) == 4` die `post.categories.limit(2).all()` aanroept
- > gaat maar 2 kinderen laden en nu `assert len(post.categories) == 2`

Dit gebeurt voor alle QuerysetProxy-methoden die gegevens retourneren:`get`,`all` en `first` en in `get_or_create` als het model al bestaat.

Merk op dat waarden geretourneerd door `create` of gemaakt in `get_or_create` en `update_or_create`
Als het model niet bestaat, wordt het toegevoegd aan de relatielijst (niet wissen).

Gegevens uit database lezen

krijgen

Krijg (**kwargs): - > model

Om slechts één van de relevante modellen gefilterd op naam te verkrijgen, kunt u de methode get (**kwargs) gebruiken.

1
2
3
4
5
6
7
8
9
# pak een categorie
Assert nieuws = = wacht op post.category.get (name = "Nieuws")

# let op dat de methode de categorie retourneert, zodat u deze waarde kunt pakken
# maar het wijzigt ook de lijst met gerelateerde modellen
# dus ongeacht wat eerder op het bovenliggende model was geladen
# nu heeft het maar één waarde - > zojuist geladen met get () call
Stel len (postcategorieën) = = 1
Assert post.categorieën [0] = = nieuws

Tip

Verwerven of creëren

get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]

Pogingen om rijen te krijgen die aan de criteria voldoen, en als er een NoMatch-uitzondering wordt gegenereerd, wordt er een nieuwe rij gemaakt met de gegeven kwargs en\ _ defaults.

!!!Tip Lees meer in het querydocument get\ _ or\ _ create

allemaal

all(**kwargs) -> List[Optional["Model"]]

Gebruik de all () -methode om een lijst met gerelateerde modellen te verkrijgen.

Houd er rekening mee dat u querysets kunt filteren, relevant kunt selecteren, velden kunt uitsluiten, enzovoort, net als normale query 's.

1
2
3
4
5
6
7
# met alle QuerySet-methoden - filteren, kolommen selecteren, tellen enz.
Wacht op news.posts.filter (titel _ _ bevat = "M2M") .all ()
wacht op Category.objects.filter (berichten _ _ auteur = Guido) .get ()

# columns modellen van veel tot veel relaties kunnen vooraf worden opgehaald
news _ posts = afwachten news.posts.select _ gerelateerd ("auteur") .all ()
Bevestig nieuws _ berichten [0]. auteur = = Guido

Tip

iteratie

iterate(**kwargs) -> AsyncGenerator["Model"]

Gebruik de iterate () -methode om gerelateerde modellen te herhalen.

Houd er rekening mee dat u querysets kunt filteren, relevant kunt selecteren, velden kunt uitsluiten, enzovoort, net als normale query 's.

1
2
3
# itereer op categorieën van dit bericht met een asynchrone generator
Async voor categorieën in post.categories.iterate ():
    Afdrukken (category.name)

Tip

Gegevens invoegen / bijwerken in de database

creëren

Aanmaken (**kwargs): - > Model

Maak gerelateerde modellen rechtstreeks vanuit het bovenliggende model.

Gekoppelde tabellen en relationele ID 's in de database worden automatisch ingevuld.

1
2
3
4
# Kolommenobjecten maken van instanties:
In afwachting van post.category.create (naam = "Tips")
Stel len (wacht op post.categories.all ()) = = 2
# nieuw aangemaakte instanties hebben al relaties in de database

Tip

Voor veel-op-veel relaties, als u aanvullende velden declareert op het expliciet verstrekte pass-through-model, is er een extra mogelijkheid om parameters door te geven die zullen worden gebruikt om het pass-through-model te maken.

Gegeven een dergelijk monster:

 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
import databases
import ormar
import sqlalchemy

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL), metadata=sqlalchemy.MetaData()
)


class Category(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="categories")

    id = ormar.Integer(primary_key=True)
    name = ormar.String(max_length=40)


class PostCategory(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="posts_x_categories")

    id: int = ormar.Integer(primary_key=True)
    sort_order: int = ormar.Integer(nullable=True)
    param_name: str = ormar.String(default="Name", max_length=200)


class Post(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    title: str = ormar.String(max_length=200)
    categories = ormar.ManyToMany(Category, through=PostCategory)

U kunt velden op model invullen in de create () aanroep op de volgende manieren:

1
2
3
4
5
6
7
Post = afwachten Post (title = "Testpost") .save ()
In afwachting van post.category.create (
    Naam = "Testcategorie1",
    # in argumenten geef een woordenboek door met namen van de doorlopende velden en toetsen
    # corresponderend met doorlopende modelvelden
    Postcategorie ={"sort_order": 1, "param_name": "volume"},
)

Verwerven of creëren

get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]

Pogingen om rijen te verkrijgen die aan de criteria voldoen, en als er een NoMatch-uitzondering wordt gegenereerd, wordt er een nieuwe rij gemaakt met de gegeven kwargs.

!!!Tip Lees meer in het querydocument get\ _ or\ _ create

Bijwerken of aanmaken

update_or_create(**kwargs) -> Model

Werk het model bij of maak een nieuw model als er geen overeenkomst is in de database.

!!!Tip Lees meer in Query Documentatie update\ _ of\ _ create

bijwerken

update(**kwargs, each:bool = False) -> int

Werk het relevante model bij met de opgegeven zoekwoordparameters en retourneer het aantal bijgewerkte rijen.

Tip

Houd er rekening mee dat parameters met veldnamen en veldwoordenboeken ook kunnen worden geaccepteerd voor veel-op-veel relationele updates.

 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
import databases
import ormar
import sqlalchemy

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL), metadata=sqlalchemy.MetaData()
)


class Category(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="categories")

    id = ormar.Integer(primary_key=True)
    name = ormar.String(max_length=40)


class PostCategory(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="posts_x_categories")

    id: int = ormar.Integer(primary_key=True)
    sort_order: int = ormar.Integer(nullable=True)
    param_name: str = ormar.String(default="Name", max_length=200)


class Post(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    title: str = ormar.String(max_length=200)
    categories = ormar.ManyToMany(Category, through=PostCategory)

In het bovenstaande voorbeeld kunt u de eigenschappen van de postcategorie bijwerken in de volgende aanroep:

1
2
3
In afwachting van post.categories.filter (name = "Testcategorie3") .update (
            PostCategorie ={"sort_order": 4}
        )

Filteren en sorteren

filter

filter(*args, **kwargs) -> QuerySet

Hiermee kunt u filteren op elk modelkenmerk / veld en instanties verkrijgen met filters over FK-relaties.

Tip

uitsluiten

exclude(*args, **kwargs) -> QuerySet

Het werkt exact hetzelfde als het filter, en alle modifiers (achtervoegsels) zijn hetzelfde, maar de niet-voorwaarde wordt geretourneerd.

Tip

Bestel basis

order_by(columns:Union[List, str]) -> QuerySet

Met order\ _ by () kunt u de resultaten in de database sorteren op de velden die u selecteert.

!!!Tip Lees meer in de query document volgorde\ _ door

Deelnemingen en subqueries

Selecteer relevant

select_related(related: Union[List, str]) -> QuerySet

Hiermee kunnen gerelateerde modellen vooraf worden opgehaald tijdens dezelfde query.

Bij het gebruik van select\ _ lated wordt altijd slechts één query uitgevoerd tegen de database, wat betekent dat een (soms complexe) join wordt gegenereerd en later geneste modellen worden verwerkt in Python.

!!!Tip Lees meer over select\ _ lated in het querydocument

prefetch correlatie

prefetch_related(related: Union[List, str]) -> QuerySet

Het is toegestaan om gerelateerde modellen vooraf op te halen tijdens query 's, maar in plaats van\ _ lated te selecteren, wordt elk volgend model opgehaald in een afzonderlijke databasequery.

Met prefetch\ _ lated voert elk model één query uit tegen de database, wat betekent dat u meerdere query 's achter elkaar zult uitvoeren.

!!!Tip Lees meer in het querydocument prefetch\ _ lated

Pagina 's en lijnen

paging

paginate(page: int, page_size: int = 20) -> QuerySet

Combineert offset- en limietmethoden op basis van paginanummer en grootte.

Tip

beperking

limit(limit_count: int) -> QuerySet

U kunt de resultaten beperken tot het vereiste aantal bovenliggende modellen.

Tip

verschoven

offset(offset: int) -> QuerySet

U kunt de resultaten compenseren met het vereiste aantal mastermodellen.

Tip

Selecteer een subset van kolommen

veld

fields(columns: Union[List, str, set, dict]) -> QuerySet

Met velden () kunt u een subset van modelkolommen kiezen om de gegevensbelasting te beperken.

Tip

uitsluitingsveld

exclude_fields(columns: Union[List, str, set, dict]) -> QuerySet

Met behalve\ _ fields () kunt u een subset van modelkolommen selecteren die u wilt uitsluiten om het laden van gegevens te beperken.

!!!Tip Meer informatie in de querydocumentatie behalve\ _ velden

aggregaat functie

graaf

count(distinct: bool = True) -> int

Retourneert het aantal rijen dat aan de gegeven criteria voldoet (d.w.z. filters en uitsluitingen toepassen).

Tip

bestaan

Bestaan () - > Booleaans

Retourneert een Booleaanse waarde om te bevestigen of er rijen zijn die aan de gegeven criteria voldoen (toegepast met filters en uitsluitingen).

Tip