Ga naar inhoud

Keer terug naar de oorspronkelijke gegevensbron

Met de volgende methoden kunt u een query uitvoeren, maar in plaats van een ormatiemodel te retourneren, retourneert u een woordenboek of een lijst met tuples.

  • values(fields = None, exclude_through = False) -> List[Dict]

  • values_list(fields = None, exclude_through = False, flatten = False) -> List

  • Query instellen Agent

    • QuerysetProxy.values(fields = None, exclude_through = False) werkwijze
    • QuerysetProxy.values_list(fields = None, exclude_through= False, flatten = False) werkwijze

!!!danger Merk op dat waarden en waarden\ _ list het parseren van het resultaat overslaan naar een ormatiemodel en daarom de validatie van het resultaat overslaan!

!!!-waarschuwing, merk op dat elk item in de resultatenlijst een één-op-één-weergave is van de rij met queryresultaten. Omdat rijen niet worden geparseerd als u een één-op-veel of veel-op-veel-relatie heeft, worden dubbele kolomwaarden weergegeven in de resultatenitems als een bovenliggende rij meerdere gerelateerde rijen heeft.

waarden

values(fields: Union[List, str, Set, Dict] = None, exclude_through: bool = False) -> List[Dict]

Retourneert een woordenboeklijst met waarden die kolommen uit de database vertegenwoordigen.

U kunt de parameter velden gebruiken om een subset van velden te selecteren die dezelfde set parameters accepteert als de methode velden ().

Houd er rekening mee dat het doorgeven van een veld aan waarden (velden) eigenlijk een snelkoppeling is naar het aanroepen van velden (velden) .waarden ().

Lees

U kunt het aantal rijen beperken door voorwaarden op te geven in filter () en behalve (), maar houd er rekening mee dat zelfs als slechts één rij (of geen rij!) aan uw criteria voldoet, u een lijst als reactie zult retourneren.

Voorbeeld:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# opgegeven modellen

Klasse Categorie (ormar. Model):
    ormar _ config = basis _ ormar _ config (tabelnaam = "categorieën")

    Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
    Naam: str = ormar. String (max _ length = 40)
    sorteer _ volgorde: int = ormar. Geheel getal (nullable = Waar)


Klasse Post (ormar. Model):
    ormar _ config = basis _ ormar _ config kopie ()

    Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
    Naam: str = ormar. String (max _ length = 200)
    Categorie: Optioneel [Categorie] = ormar. ForeignKey (Categorie)

# voorbeeldgegevens
Nieuws = afwachten Categorie (naam = "Nieuws", sort _ order = 0) .save ()
In afwachting van bericht (naam = "Ormar slaat weer toe!", categorie = nieuws) .save ()
In afwachting van bericht (naam = "Waarom gebruik je ormar nog niet?", categorie = nieuws) .save ()
In afwachting van bericht (naam = "Bekijk dit, ormar nu gratis", categorie = nieuws) .save ()

Toegang tot het postmodel:

1
2
3
4
5
6
Posts = afwachten Post.objects.waarden ()
Beweerde berichten = = [
    {"id": 1, "name": "Ormar strikes again!", "category": 1},
    {"id": 2, "name": "Why don't you use ormar yet?", "category": 1},
    {"id": 3, "name": "Check this out, ormar now for free", "category": 1},
]

Als u tegelijkertijd verwante modellen wilt selecteren, gebruikt u select\ _ lated of prefetch\ _ lated.

Merk op hoe de geneste modelkolommen worden voorafgegaan door het volledige relationele pad van het autonome model (het model dat in de query wordt gebruikt).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# modellen aangeven

Klasse Gebruiker (ormar. Model):
    ormar _ config = basis _ ormar _ config kopie ()

    Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
    Naam: str = ormar. String (max _ length = 100)


Klasse Rol (ormar. Model):
    ormar _ config = basis _ ormar _ config kopie ()

    Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
    Naam: str = ormar. String (max _ length = 100)
    Gebruikers: Lijst [Gebruiker] = ormar. ManyToMany (Gebruiker)

# voorbeeldgegevens
Maker = await Gebruiker (naam = "Anoniem") .save ()
Admin = afwachten Rol (naam = "admin") .save ()
Editor = afwachten Rol (naam = "editor") .save ()
Wacht op creator.karakters.add (admin)
Wacht op creator.karakters.add (redacteur)

Selecteer gebruikers met rollen

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
User = await User.objects.select _ gerelateerd ("rollen") .waarden ()
# noot geneste voorvoegsels: rolusers en rollen
Beweren gebruiker = = [
    {
        "ID-nummer": 1,
        "Naam": "Anoniem",
        "roleuser _ _ id": 1,
        "roleuser _ _ rol": 1,
        "roleuser _ _ user": 1,
        "rollen _ _ id": 1,
        "rollen _ _ naam": "admin",
    },
    {
        "ID-nummer": 1,
        "Naam": "Anoniem",
        "roleuser _ _ id": 2,
        "roleuser _ _ rol": 2,
        "roleuser _ _ user": 1,
        "rollen _ _ id": 2,
        "rollen _ _ naam": "redacteur",
    },
]

!!!Merk op dat de relatie tussen rollen en gebruikers veel-op-veel is, dus u kunt standaard ook modelkolommen krijgen.

Combineer relevante velden en velden om slechts 3 velden te selecteren.

Houd er rekening mee dat we de definitie ook per model hebben uitgesloten, omdat per definitie wordt aangenomen dat elk model in de join, maar zonder verwijzingen in de velden, volledig is geselecteerd (inclusief alle velden).

!!!Merk op dat u, in tegenstelling tot de andere querysetbenaderingen hier, het tussenliggende model kunt uitsluiten, maar de achterliggende kolommen kunt behouden, wat geen zin heeft bij het ontleden van de oorspronkelijke gegevensbron in een model.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
Dus in relatie categorie - > category _ x _ post - > post - > user kan je uitsluiten
category _ x _ post en post modellen maar kan de gebruiker één houden.
Context die niet mogelijk is alsof je via en post modellen zou uitsluiten
Er zou geen manier zijn om gebruikersmodellen te bereiken vanuit categoriemodellen).


Gebruiker = (
        Wacht op Role.objects.select _ gerelateerd ("gebruikers _ _ categorieën")
        . filter (naam = "admin")
        . Velden ({"naam":..., "gebruikers": {"naam":..., "categorieën":{"name"}}})
        exclude _ fields ("Rolgebruiker")
        . Waarden ()
    )
Beweren gebruiker = = [
    {
        "Naam": "beheerder",
        "gebruikers _ _ naam": "Anoniem",
        "gebruikers _ _ categorieën _ _ naam": "Nieuws",
    }
]

Als er meerdere ManyToMany-modellen in de query staan, moet u elk model handmatig uitsluiten.

Om deze belasting te vermijden, geeft ormar u de parameter behalve\ _ door = Onwaar. Als deze vlag is ingesteld op Waar, zijn alle modellen volledig uitgesloten.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# equivalent aan query hierboven, let op gebrek aan exclude _ fields aanroep
Gebruiker = (
    Wacht op Role.objects.select _ gerelateerd ("gebruikers _ _ categorieën")
    . filter (naam = "admin")
    . Velden ({"naam":..., "gebruikers": {"naam":..., "categorieën":{"name"}}})
    . Waarden (uitsluiten _ door = Waar)
)
Beweren gebruiker = = [
    {
        "Naam": "beheerder",
        "gebruikers _ _ naam": "Anoniem",
        "gebruikers _ _ categorieën _ _ naam": "Nieuws",
    }
]

waarde lijst

values_list(fields: Union[List, str, Set, Dict] = None, flatten: bool = False, exclude_through: bool = False) -> List

Retourneert een lijst met tuples die de waarden van kolommen uit de database vertegenwoordigen.

U kunt de parameter velden gebruiken om een subset van velden te selecteren die dezelfde set parameters accepteert als de methode velden ().

Merk op dat het doorgeven van een veld aan waarden\ _ list (velden) eigenlijk een snelkoppeling is naar het aanroepen van velden (velden) .waarden\ _ list ().

Lees

Als u slechts één kolom / veld selecteert, kunt u flatten = True doorgeven, wat een lijst met waarden retourneert in plaats van een lijst met elementtuples.

!!!waarschuwt dat het instellen van flatten = True QueryDefinitionError uitzondering zal opleveren als meerdere (of geen, wat betekent dat alle) velden zijn geselecteerd.

U kunt het aantal rijen beperken door voorwaarden op te geven in filter () en behalve (), maar houd er rekening mee dat zelfs als slechts één rij (of geen rij!) aan uw criteria voldoet, u een lijst als reactie zult retourneren.

Voorbeeld:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# opgegeven modellen

Klasse Categorie (ormar. Model):
    ormar _ config = basis _ ormar _ config (tabelnaam = "categorieën")

    Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
    Naam: str = ormar. String (max _ length = 40)
    sorteer _ volgorde: int = ormar. Geheel getal (nullable = Waar)


Klasse Post (ormar. Model):
    ormar _ config = basis _ ormar _ config kopie ()

    Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
    Naam: str = ormar. String (max _ length = 200)
    Categorie: Optioneel [Categorie] = ormar. ForeignKey (Categorie)

# voorbeeldgegevens
Nieuws = afwachten Categorie (naam = "Nieuws", sort _ order = 0) .save ()
In afwachting van bericht (naam = "Ormar slaat weer toe!", categorie = nieuws) .save ()
In afwachting van bericht (naam = "Waarom gebruik je ormar nog niet?", categorie = nieuws) .save ()
In afwachting van bericht (naam = "Bekijk dit, ormar nu gratis", categorie = nieuws) .save ()

Toegang tot het postmodel:

1
2
3
4
5
6
7
Posts = afwachten Post.objects.value _ list ()
# let op hoe kolommen verwijzen naar id, naam en categorie (fk)
Beweerde berichten = = [
    (1, "Ormar slaat weer toe!", 1),
    (2, "Waarom gebruik je ormar nog niet?", 1),
    (3, "Bekijk dit, ormar nu gratis", 1),
]

Als u tegelijkertijd verwante modellen wilt selecteren, gebruikt u select\ _ lated of prefetch\ _ lated.

Laten we de relatie ingewikkelder maken en het eerder genoemde categoriemodel aanpassen om naar het gebruikersmodel te verwijzen.

1
2
3
4
5
6
7
8
Klasse Categorie (ormar. Model):
    ormar _ config = basis _ ormar _ config (tabelnaam = "categorieën")

    Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
    Naam: str = ormar. String (max _ length = 40)
    sorteer _ volgorde: int = ormar. Geheel getal (nullable = Waar)
    # nieuwe kolom hieronder
    aangemaakt _ door: Optioneel [Gebruiker] = ormar. ForeignKey (Gebruiker, gerelateerde _ naam = "categorieën")

Maak nu voorbeeldgegevens met gebruikerslinks.

1
2
3
4
5
6
Maker = await Gebruiker (naam = "Anoniem") .save ()
Admin = afwachten Rol (naam = "admin") .save ()
Editor = afwachten Rol (naam = "editor") .save ()
Wacht op creator.karakters.add (admin)
Wacht op creator.karakters.add (redacteur)
Nieuws = wacht Categorie (naam = "Nieuws", sort _ order = 0, gemaakt _ door = creator) .save ()

Combineer relevante velden en velden om slechts 3 velden te selecteren.

Houd er rekening mee dat we de definitie ook per model hebben uitgesloten, omdat per definitie wordt aangenomen dat elk model in de join, maar zonder verwijzingen in de velden, volledig is geselecteerd (inclusief alle velden).

!!!Merk op dat u, in tegenstelling tot de andere querysetbenaderingen hier, het tussenliggende model kunt uitsluiten, maar de achterliggende kolommen kunt behouden, wat geen zin heeft bij het ontleden van de oorspronkelijke gegevensbron in een model.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Dus in relatie categorie - > category _ x _ post - > post - > user kan je uitsluiten
category _ x _ post en post modellen maar kan de gebruiker één houden.
Context die niet mogelijk is alsof je via en post modellen zou uitsluiten
Er zou geen manier zijn om gebruikersmodellen te bereiken vanuit categoriemodellen).


Gebruiker = (
        Wacht op Role.objects.select _ gerelateerd ("gebruikers _ _ categorieën")
        . filter (naam = "admin")
        . Velden ({"naam":..., "gebruikers": {"naam":..., "categorieën":{"name"}}})
        exclude _ fields ("Rolgebruiker")
        . waarden _ lijst ()
    )
Beweren gebruiker = = [("admin", "Anoniem", "Nieuws")]

Als er meerdere ManyToMany-modellen in de query staan, moet u elk model handmatig uitsluiten.

Om deze belasting te vermijden, geeft ormar u de parameter behalve\ _ door = Onwaar. Als deze vlag is ingesteld op Waar, zijn alle modellen volledig uitgesloten.

1
2
3
4
5
6
7
8
# equivalent aan query hierboven, let op gebrek aan exclude _ fields aanroep
Gebruiker = (
        Wacht op Role.objects.select _ gerelateerd ("gebruikers _ _ categorieën")
        . filter (naam = "admin")
        . Velden ({"naam":..., "gebruikers": {"naam":..., "categorieën":{"name"}}})
        waarden _ lijst (uitsluiten _ door = Waar)
    )
Beweren gebruiker = = [("admin", "Anoniem", "Nieuws")]

Gebruik platten om een lijst met waarden te krijgen.

1
2
3
4
5
6
# afvlakking met meer dan één veld zal uitzonderingen opleveren!
wacht op Role.objects.fields ({"name", "id"}) .waarden _ lijst (plat = waar)

# correct gebruik
Rollen = afwachten Role.objects.fields ("naam"). waarden _ lijst (plat = Waar)
Rollen bevestigen = = ["admin", "editor"]

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.

!!!-waarschuwing Omdat het gebruik van waarden en waarden\ _ list het parseren en valideren van modellen overslaat, wissen deze twee methoden het momenteel geladen gerelateerde model niet en overschrijven ze het momenteel geladen model niet met hun eigen oproepresultaten in vergelijking met alle andere leesmethoden in querysetproxy!

waarden

Hetzelfde als de waardefunctie hierboven, maar u kunt het gerelateerde object ophalen aan de andere kant van de relatie.

Ga

waarde lijst

Precies hetzelfde als de functie value\ _ list hierboven, maar u kunt gerelateerde objecten opvragen of maken vanaf het andere uiteinde van de relatie.

Ga