コンテンツにスキップ

クエリセットエージェント

関連するManyTomanyフィールドとReverseForeignKeyに直接アクセスする場合は、関連するモデルのリストを返します。

ただし、QuerySet APIのサブセットを公開しているため、親モデルから直接フィルタリング、作成、関連モデルの選択などを行うことができます。

!!!(注)デフォルトでは、公開されているQuerySetは、親モデルに関連するモデルのみを返すようにフィルタリングされています。

1
したがって、`post.categories.all()` を発行すると、その投稿に関連するすべてのカテゴリが表示されます。

!!!note QuerysetProxyを介してQuerySet APIメソッドにアクセスする場合、通常のクエリのようにオブジェクトプロパティを使用する必要はないことに注意してください。

1
2
3
だから、それは `post.categories.all()` と**であり、**`post.categories.objects.all()` ではないことに注意してください。

利用可能なQuerySetメソッドの詳細については、[クエリ][queries]を参照してください。

!!!警告ManyTomanyから関連モデルをクエリすると、親モデルにロードされている関連モデルのリストがクリアされます。

1
2
3
4
5
6
7
8
9
例:`post.categories.first()` は、関連する1つのモデルのリストにpost.categoryを設定します->first()が返すもの

例2: postに4つのカテゴリがある場合、`len(post.categories) == 4` は `post.categories.limit(2).all()` を呼び出します
->2人の子供だけをロードします。 `assert len(post.categories) == 2`

これは、データを返すすべてのQuerysetProxyメソッド(`get`、`all`、`first`)と、モデルがすでに存在する場合は `get_or_create` で発生します。

`create` によって返されるか、`get_or_create` と `update_or_create` で作成された値
モデルが存在しない場合、リレーションリストに追加されます(クリアされません)。

データベースからデータを読み込む

得る

get(**kwargs):->モデル

名前でフィルタリングされた関連モデルの1つだけを取得するには、get(**kwargs)メソッドを使用します。

1
2
3
4
5
6
7
8
9
#カテゴリーを1つ取得
assert news==await post. category.get(name="News")

#この値を取得できるように、メソッドがカテゴリを返すことに注意してください。
#しかし、関連するモデルのリストも変更します。
#だから、以前に親モデルにロードされたものに関係なく
#今では1つの値しかありません->get()コールでロードされただけです
assert len(post. category)==1
assert post. category[0]==ニュース

Tipクエリドキュメントで詳細を読む

取得または作成

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

条件を満たすローを取得しようとすると、NoMatch例外が発生した場合、指定されたkwargsと_defaaultを使用して新しいローが作成されます。

!!!tipクエリドキュメントget_or_createで詳細を読む

全部

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

関連するモデルのリストを取得するには、all()メソッドを使用します。

通常のクエリと同様に、クエリセットをフィルタリングしたり、関連するものを選択したり、フィールドを除外したりできます。

1
2
3
4
5
6
7
#すべてのQuery setメソッド-フィルタリング、列の選択、カウントなど。
await news. post.filter(title__include="M 2 M").all()
await Category. object.filter(post__Author=Guide o).get()

#多くの関係の列モデルをプリフェッチすることができます。
news_post=await news. post.select_関連("著者").all()
assert news_post[0]。著者==ガイド

Tipクエリドキュメントで詳細を読む

反復

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

関連するモデルを反復するには、iterate()メソッドを使用します。

通常のクエリと同様に、クエリセットをフィルタリングしたり、関連するものを選択したり、フィールドを除外したりできます。

1
2
3
#非同期ジェネレーターを使用して、この投稿のカテゴリを反復します。
post. category.iterate()内のカテゴリを非同期化します。
    印刷(category.name)

Tipクエリドキュメントの反復処理で詳細を読む

データベースへのデータの挿入/更新

創造する

作成(**kwargs):->モデル

親モデルから直接関連モデルを作成します。

リンクされたテーブルとデータベースのリレーショナルIDが自動的に入力されます。

1
2
3
4
#インスタンスから列オブジェクトを作成する:
post. category.createを待ちます(name="Tips")
assert len(await post. category.all())==2
#新しく作成されたインスタンスは、すでにデータベースにリレーションを保持しています。

ヒントクエリドキュメントの作成で詳細を読む

多対多の関係の場合、明示的に提供されているパススルーモデルで他のフィールドを宣言した場合、パススルーモデルの作成に使用されるパラメーターを渡す追加機能があります。

このようなサンプルが与えられた場合:

 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)

create()呼び出しのフィールドにモデルを入力するには、次の方法があります。

1
2
3
4
5
6
7
post=await Post(title="テストポスト"). save()
ポストを待ちます。カテゴリを作成します。
    name="テストカテゴリ1",
    #引数には、スルーフィールドの名前とキーを含む辞書を渡す
    #モデルフィールドを通じて対応
    postcategory={"sort_order": 1, "param_name": "volume"},
)

取得または作成

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

条件を満たすローを取得しようとすると、NoMatch例外が発生すると、指定されたkwargsを使用して新しいローが作成されます。

!!!tipクエリドキュメントget_or_createで詳細を読む

更新または作成

update_or_create(**kwargs) -> Model

モデルを更新するか、データベースに一致するものがない場合に新しいモデルを作成します。

!!!tipクエリドキュメントupdate_or_createで詳細を読む

更新する

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

指定されたキーワードパラメーターを使用して関連するモデルを更新し、更新された行数を返します。

Tipクエリドキュメントの更新で詳細を読む

多対多リレーションシップの更新では、フィールド名とフィールドディクショナリを含むパラメーターも使用できることに注意してください。

 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)

上記の例では、次の呼び出しでpostcategoryのプロパティを更新できます。

1
2
3
post. category.filter(name="テストカテゴリ3").update(
            ポストカテゴリー={"sort_order": 4}
        )

フィルタリングとソート

フィルタリング

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

クロスFKリレーションシップのフィルターを使用して、任意のモデルプロパティ/フィールドでインスタンスをフィルタリングおよび取得できます。

Tipクエリドキュメントフィルターで詳細を読む

除外する

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

フィルターとまったく同じように動作し、すべての修飾子(接尾辞)は同じですが、not条件を返します。

Tipクエリドキュメントで詳細を読む除外

注文の根拠

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

order_by()を使用すると、選択したフィールドに基づいてデータベースの結果を並べ替えることができます。

!!!tipクエリドキュメントorder_byで詳細を読む

接続とサブクエリ

関連を選択

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

同じクエリ中に関連するモデルを事前にフェッチできます。

select_atedを使用すると、常にデータベースに対して1つのクエリのみが実行されます。つまり、(場合によっては複雑な)接続が生成され、後でネストされたモデルがPythonで処理されます。

!!!tipクエリドキュメントでselect_atedの詳細を読む

プリフェッチ関連

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

クエリ中に関連するモデルを事前にフェッチできますが、select_atedとは対照的に、後続の各モデルは個別のデータベースクエリでフェッチされます。

prefetch_atedを使用すると、各モデルはデータベースに対してクエリを実行します。つまり、複数のクエリを1つずつ実行します。

!!!tipクエリドキュメントprefetch_atedで詳細を読む

ページングと行数

ページング

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

ページ番号とサイズに基づくオフセットと制限の方法が組み合わされています。

Tipクエリドキュメントのページングで詳細を読む

制限する

limit(limit_count: int) -> QuerySet

結果を必要な親モデルの数に制限できます。

Tipクエリドキュメントの制限で詳細を読む

相殺する

offset(offset: int) -> QuerySet

必要なマスターモデルの数で結果を相殺することができます。

Tipクエリドキュメントオフセットで詳細を読む

列のサブセットを選択

ドメイン

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

field()を使用すると、モデル列のサブセットを選択してデータの負荷を制限できます。

Tipクエリドキュメントフィールドで詳細を読む

除外フィールド

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

除_field()を使用すると、除外するモデル列のサブセットを選択して、データの読み込みを制限できます。

!!!tip詳細については、クエリドキュメントを参照してください。

集計関数

数える

count(distinct: bool = True) -> int

指定された条件に一致するローの数を返します(つまり、フィルターと除外を適用します)

Tipドキュメントカウントのクエリで詳細を読む

存在する

存在()->ブール値

指定された条件を満たすローがあるかどうかを確認するブール値を返します(フィルターと除外とともに適用されます)

Tipもっと読むクエリドキュメントが存在します