Zum Inhalt

Frage an den Vereinsvertreter

Wenn Sie direkt auf das zugehörige Feld ManyToMany und ReverseForeignKey zugreifen, wird eine Liste der zugehörigen Modelle zurückgegeben.

Gleichzeitig wird jedoch eine Teilmenge der QuerySet-API verfügbar gemacht, sodass Sie relevante Modelle direkt aus dem übergeordneten Modell filtern, erstellen, auswählen usw. können.

!!!Hinweis Standardmäßig wurde ein öffentlich verfügbares QuerySet so gefiltert, dass nur die Modelle zurückgegeben werden, die mit dem übergeordneten Modell verknüpft sind.

1
Wenn Sie Probleme haben `post.categories.all()` Du wirst alle Kategorien zu diesem Thema bekommen, nicht alle auf dem Tisch.

!!!-note Beachten Sie, dass Sie beim Zugriff auf QuerySet-API-Methoden über QuerysetProxy nicht die Objekteigenschaften wie normale Abfragen verwenden müssen.

1
2
3
So beachten Sie, dass `post.categories.all()` und**nicht**sind  `post.categories.objects.all()` ist.

Erfahren Sie mehr über die verfügbaren QuerySet Methods Visits [Die Queries][queries]

!!!Warnung Eine Abfrage eines verknüpften Modells aus ManyToMany löscht die Liste der verwandten Modelle, die auf das übergeordnete Modell geladen werden:

1
2
3
4
5
6
7
8
9
Beispiel:`post.categories.first()` will post. categories to list of 1 related model-> the one returned by first ()()(`post.categories.first()` will post. categories to list of 1 related model-> the one returned by first ()())(Liste von 1 related Modell-> der durch den ersten () zurückgegebenen Punkt setzen)

Beispiel 2: if post has 4 categories So `len(post.categories) == 4` calling `post.categories.limit(2).all()`
- > Load nur zwei Kinder und jetzt `assert len(post.categories) == 2`

Dies geschieht für alle QuerysetProxy-Methoden, die Daten zurückgeben: `get`, `all` and `first` and im `get_or_create` Das Modell existiert bereits.

Dieser Wert wird zurückgegeben `create` oder geschaffen in `get_or_create` and `update_or_create`
Wenn das Modell nicht vorhanden ist, wird es zur Relationsliste hinzugefügt (es wird nicht gelöscht).

Auslesen von Daten aus der Datenbank

erhalten.

get (**kwargs): -> Beschreibung

Um nur eines der nach Namen gefilterten relationalen Modelle zu erhalten, können Sie get (**Die Kwars-Methode.

1
2
3
4
5
6
7
8
9
#grab one category/eine Kategorie
await post. categories. get (name ="Neuigkeiten")

Diese Methode gibt die Kategorie zurück, so dass Sie diesen Wert grab
#Aber es ist auch eine Liste von Modellen an einem Ort
Es ist sehr wichtig, was zuvor auf einem parent-modell geladen wurde.
Jetzt hat es nur einen Wert-> just loaded with get () call
assert len (post . categories) = = 1
assert post . categories [ 0 ] = = Nachrichten

Tip

Erwerben oder schaffen

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

Versuchen Sie , eine Zeile zu erhalten , die die Bedingung erfüllt , und wenn eine NoMatch-Ausnahme ausgelöst wird , wird eine neue Zeile mit den angegebenen kwargs und \ _ defaults erstellt .

Tip

Alles .

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

Um eine Liste der verwandten Modelle zu erhalten , verwenden Sie die all () - Methode .

Beachten Sie , dass Sie Abfragesätze wie normale Abfragen filtern , relevante , ausgeschlossene Felder usw . auswählen können .

1
2
3
4
5
6
7
Mit allen Queryset-Methoden - Filterung , Auswahl von Farbräumen , etc.
await news . posts . filter (title _ contains = " M2M ") . all () (() ist ein
await Category . objects . filter (posts _ _ author = guido) . get () () (Englisch)

* Farbmuster von vielen bis vielen Beziehungen können verbessert werden
NEWS _ POST = Nachrichtnews.posts.select_ related (" der Autor ") . all ()
assert news _ posts [ 0 ] . author = = guido [ Bearbeiten | Quelltext bearbeiten ]

Tip

Umbenennung

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

Um das zugehörige Modell zu durchlaufen , verwenden Sie die iterate () - Methode .

Beachten Sie , dass Sie Abfragesätze wie normale Abfragen filtern , relevante , ausgeschlossene Felder usw . auswählen können .

1
2
3
# iterate on categories of this post mit einem Async-Generator
async for category in post . categories . iterate () : async für die Kategorie post . categories . iterate ()
    print (Kategorie : Vorname)

Tip

Einfügen/Aktualisieren von Daten in eine Datenbank

erschaffen .

Erstellen (**kwargs): -> Modell

Erstellen Sie relevante Modelle direkt aus dem übergeordneten Modell.

Verknüpfte Tabellen und relationale IDs in der Datenbank werden automatisch ausgefüllt.

1
2
3
4
Erstellen von Farbräumen aus der Situation:
await post. categories. create (name ="Tips")[Bearbeiten | Quelltext bearbeiten]
assert len (await post. categories. all ())== 2
#newly created instances already have relation persisted in der Datenbank

Tip

Wenn Sie für eine Mehr-zu-Mehr-Beziehung zusätzliche Felder auf dem explizit bereitgestellten Passthrough-Modell deklarieren, gibt es eine zusätzliche Funktion für den Übergabeparameter, die zum Erstellen eines Passthrough-Modells verwendet wird.

Gegeben sind solche Modelle:

 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)

Sie können das Modell mit Feldern in einem create ()-Aufruf wie folgt füllen:

1
2
3
4
5
6
7
post = await Post (title ="Testbeitrag"). save ()
Das Bild ist ein Bild. create (
    name ="Test category1", oder
    Argumente, die ein Wörterbuch mit dem Namen des Through Field and Keys passieren
    Korrigieren von Modellfields
    postcategory ={"sort_order": 1, "param_name": "volume"},
)

Erwerben oder schaffen

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

Versuchen Sie, eine Zeile zu erhalten, die die Kriterien erfüllt, und wenn eine NoMatch-Ausnahme ausgelöst wird, wird eine neue Zeile mit einem bestimmten kwargs erstellt.

Tip

Aktualisieren oder Erstellen

update_or_create(**kwargs) -> Model

Aktualisieren Sie das Modell oder erstellen Sie ein neues Modell, wenn es keine Übereinstimmung in der Datenbank gibt.

!!!tip Lesen Sie mehr in der Abfrage-Dokumentation update_or_create

Aktualisierung

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

Aktualisieren Sie die relevanten Modelle mit den angegebenen Schlüsselwortargumenten, um die Anzahl der aktualisierten Zeilen zurückzugeben.

Tip

Beachten Sie, dass bei Updates mit mehreren Beziehungen auch Parameter mit Feldnamen und Dictionaries akzeptiert werden können.

 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)

Im obigen Beispiel können Sie die Eigenschaft postcategory im folgenden Aufruf aktualisieren:

1
2
3
Seite 1-Die Seite wurde neu angelegt: "Die Seite" WEB (
            postKategorie ={"sort_order": 4}
        )

Filterung und Ordnung

Auswählen

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

Ermöglicht Ihnen, Filter für FK-Beziehungen zu verwenden, um nach beliebigen Modellattributen/-feldern zu filtern und eine Instanz zu erhalten.

Tip

Ausgeschlossen

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

Es funktioniert genau wie ein Filter, und alle Modifikatoren (Suffixe) sind gleich, geben aber die Bedingung not zurück.

Tip

Bestellung basiert.

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

Mit order_by () können Sie die Ergebnisse in Ihrer Datenbank nach ausgewählten Feldern sortieren.

Tip

Kontakt und Untersuche.

Auswahl betrifft.

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

Ermöglicht das Vornehmen relevanter Modelle während derselben Abfrage.

Wenn Sie select_lated verwenden, führen Sie immer nur eine Abfrage in Ihrer Datenbank aus, was bedeutet, dass eine (manchmal komplizierte) Verbindung generiert wird, die später mit verschachtelten Modellen in Python verarbeitet wird.

!!!tip Lesen Sie mehr über select_lated in der Abfragedokumentation

Vorausschauende relevant

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

Ermöglicht das Pre-Abrufen relationaler Modelle während einer Abfrage-im Gegensatz zu select_lated wird jedoch jedes nachfolgende Modell in einer separaten Datenbankabfrage erworben.

Bei Verwendung von prefetch_lated führt jedes Modell eine Abfrage für die Datenbank aus, d. h. Sie führen mehrere Abfragen nacheinander aus.

Tip

Seiten und Anzahl

Seite Seite

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

Kombiniert werden Offset-und Einschränkungsmethoden basierend auf Seitenzahl und Größe.

Tip

Begrenzung

limit(limit_count: int) -> QuerySet

Sie können die Ergebnisse auf die erforderliche Anzahl von übergeordneten Modellen beschränken.

Tip

Offset ausgleichende

offset(offset: int) -> QuerySet

Sie können die Ergebnisse durch die erforderliche Anzahl von Mastermodellen ausgleichen.

Tip

Auswahl der Teilmengen.

Bereich

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

Mit fields () können Sie eine Teilmenge der Modellspalte auswählen, um die Datenlast zu begrenzen.

Tip

Ausschlusswort

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

Mit except_fields () können Sie eine Teilmenge der Modellspalten auswählen, die ausgeschlossen werden sollen, um das Laden von Daten zu begrenzen.

!!!tip Weitere Informationen in der Abfragedokumentation außer_fields

Sammelfunktion

Anzahl der

count(distinct: bool = True) -> int

Gibt die Anzahl der Zeilen zurück, die der angegebenen Bedingung entsprechen (d. h. Filter und Ausschlüsse anwenden)

Tip

Existiert

vorhanden ()-> boolesche Werte

Gibt einen booleschen Wert zurück, um zu bestätigen, dass eine Zeile eine bestimmte Bedingung erfüllt (gilt mit Filtern und Ausschlüssen)

Tip