元のデータを返します
次のメソッドを使用すると、クエリを実行できますが、ormarモデルではなく、辞書またはタプルリストを返します。
-
values(fields = None, exclude_through = False) -> List[Dict]
-
values_list(fields = None, exclude_through = False, flatten = False) -> List
-
クエリセットエージェント
QuerysetProxy.values(fields = None, exclude_through = False) 方法
QuerysetProxy.values_list(fields = None, exclude_through= False, flatten = False) 方法
!!!危険値と値_listは、結果をormarモデルに解析するため、結果の検証もスキップすることに注意してください。
!!!警告結果リストの各エントリは、クエリの結果行の1対1の反映であることに注意してください。1対多または多対多の関係がある場合、行は解析されないため、親行に複数の関連行がある場合、結果エントリに重複するカラム値が表示されます。
価値観
values(fields: Union[List, str, Set, Dict] = None, exclude_through: bool = False) -> List[Dict]
データベースのカラムの値を表すディクショナリのリストを返します。
field()メソッドと同じパラメーターセットを受け取るフィールドのサブセットを、fieldパラメーターを使用して選択できます。
フィールドをvalues(field)に渡すことは、実際にはfield(field). values()を呼び出すためのショートカットであることに注意してください。
!!!ヒントフィールドに渡すことができるものと、ネストされたモデルフィールドを選択する方法の詳細については、列の選択に関するドキュメントをお読みください
filter()とout side()に条件を指定することで行数を制限することができますが、条件に合致する行が1行しかない(もしくは1行もない!)場合でもレスポンスとしてリストを返してしまうので注意が必要です。
例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | #宣言されたモデル
class Category(ormar. Model):
or_config=base_or_config. copy(tablename="カテゴリ")
id: int=ormar.Integer(プライマリキー=True)
name: str=ormar.String(max_length=40)
sort_order: int=ormar.Integer(nullable=True)
class Post(ormar. Model):
base_or_config. copy()
id: int=ormar.Integer(プライマリキー=True)
name: str=ormar.String(max_length=200)
カテゴリー:オプション[カテゴリー]=ormar. ForeignKey(カテゴリー)
#サンプルデータ
news=await Category(name="News", sort_order=0).save()
await Post(name="Ormar strikes Again!", category=news).save()
await Post(name="まだormarを使っていないのはなぜですか?", category=news).save()
await Post(name="Check this out, ormar now for free",category=news).save()
|
郵便モデルへのアクセス:
| post=await Post. object.values()
投稿をアサートする==[
{"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},
]
|
関連するモデルを同時に選択するには、select_lateまたはprefetch_lateを使用します。
ネストされたモデル列が自律モデル(クエリで使用されるモデル)の完全なリレーショナルパスをプレフィックスとして使用する方法に注意してください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | #モデルを宣言する
class User(ormar. Model):
base_or_config. copy()
id: int=ormar.Integer(プライマリキー=True)
name: str=ormar.String(max_length=100)
class Role(ormar. Model):
base_or_config. copy()
id: int=ormar.Integer(プライマリキー=True)
name: str=ormar.String(max_length=100)
users: List[User]=ormar.ManyTomany(User)
#サンプルデータ
creator=await User(name="Anonymous"). save()
admin=await Role(name="admin"). save()
editor=await Role(name="editor"). save()
作成者を待っています。
await creator. role.add(エディタ)
|
ロールを持つユーザーを選択します
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. object.select_関連("役割").values()
#noteネストされたプレフィックス: roleuserと役割
assertユーザー==[
{
"id": 1,
"name":"匿名",
"roleuser__id": 1,
"roleuser__role": 1,
"roleuser__user": 1,
"roles__id": 1,
"roles__name":"admin",
},
{
"id": 1,
"name":"匿名",
"roleuser__id": 2,
"roleuser__role": 2,
"roleuser__user": 1,
"roles__id": 2,
"roles__name":"editor",
},
]
|
!!!メモロールとユーザーの関係は多対多の関係であるため、デフォルトではモデル列も取得できることに注意してください。
関連するフィールドとフィールドを組み合わせて選択し、3つのフィールドのみを選択します。
定義によれば、接続に含まれているがフィールドに参照がない各モデルは、完全に選択されている(すべてのフィールドを含む)と見なされるため、モデルによる定義も除外していることに注意してください。
!!!注ここでの他のクエリセットメソッドとは異なり、中間モデルを除外し、末尾の列を保持できます。これは、生データをモデルに解析する場合には意味がないことに注意してください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | したがって、カテゴリ->カテゴリ_x_投稿->投稿->ユーザーの関係では、除外することができます。
category_x_postとpostモデルですが、ユーザーを1つに保つことができます。(
スルーモデルとポストモデルを除外するかのように不可能なコンテキスト
カテゴリーモデルからユーザーモデルに到達する方法はないでしょう。
ユーザー=(
awaitロール。オブジェクト。関連する選択("ユーザー__カテゴリ")
. filter(name="admin")
. field({"name":.。。"users":{"name":.。。、"カテゴリ":{"name"}}})
除外フィールド("roleuser")
. values()
)
assertユーザー==[
{
"name":"admin",
"user__name":"匿名",
"user__カテゴリ__name":"ニュース",
}
]
|
クエリに複数のManyTomanyモデルがある場合は、各モデルを手動で除外する必要があります。
この負担を回避するために、ormarでは「out side_through=False」パラメータを用意しています。このフラグを「True」に設定すると、すべてのモデルが完全に除外されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | #上記のクエリと同等で、除外フィールドコールがないことに注意してください。
ユーザー=(
awaitロール。オブジェクト。関連する選択("ユーザー__カテゴリ")
. filter(name="admin")
. field({"name":.。。"users":{"name":.。。、"カテゴリ":{"name"}}})
. values(除外_スルー=True)
)
assertユーザー==[
{
"name":"admin",
"user__name":"匿名",
"user__カテゴリ__name":"ニュース",
}
]
|
値のリスト
values_list(fields: Union[List, str, Set, Dict] = None, flatten: bool = False, exclude_through: bool = False) -> List
データベースのカラムの値を表すタプルのリストを返します。
field()メソッドと同じパラメーターセットを受け取るフィールドのサブセットを、fieldパラメーターを使用して選択できます。
値_list(field)にフィールドを渡すことは、実際にはfield(field). values_list()を呼び出すためのショートカットであることに注意してください。
!!!ヒントフィールドに渡すことができるものと、ネストされたモデルフィールドを選択する方法の詳細については、列の選択に関するドキュメントをお読みください
列/フィールドを1つだけ選択した場合、要素のタプルのリストではなく、値のリストを返すflatten=Trueを渡すことができます。
!!!は、複数の(またはない、つまりすべての)フィールドを選択すると、flatten=Trueを設定すると例外が発生することを警告QueryDefinitionErrorます。
filter()とout side()に条件を指定することで行数を制限することができますが、条件に合致する行が1行しかない(もしくは1行もない!)場合でもレスポンスとしてリストを返してしまうので注意が必要です。
例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | #宣言されたモデル
class Category(ormar. Model):
or_config=base_or_config. copy(tablename="カテゴリ")
id: int=ormar.Integer(プライマリキー=True)
name: str=ormar.String(max_length=40)
sort_order: int=ormar.Integer(nullable=True)
class Post(ormar. Model):
base_or_config. copy()
id: int=ormar.Integer(プライマリキー=True)
name: str=ormar.String(max_length=200)
カテゴリー:オプション[カテゴリー]=ormar. ForeignKey(カテゴリー)
#サンプルデータ
news=await Category(name="News", sort_order=0).save()
await Post(name="Ormar strikes Again!", category=news).save()
await Post(name="まだormarを使っていないのはなぜですか?", category=news).save()
await Post(name="Check this out, ormar now for free",category=news).save()
|
郵便モデルへのアクセス:
| post=await Post. object.values_list()
#列がID、名前、カテゴリ(fk)を参照する方法に注意してください。
投稿をアサートする==[
(1,「オーマーは再び攻撃する!」,1),
(2,「なぜまだormarを使わないのですか?」,1),
(3、「これをチェックして、今すぐ無料でormar」、1)、
]
|
関連するモデルを同時に選択するには、select_lateまたはprefetch_lateを使用します。
関係を複雑にして、先ほどのカテゴリモデルを修正してユーザモデルを参照してみましょう。
| class Category(ormar. Model):
or_config=base_or_config. copy(tablename="カテゴリ")
id: int=ormar.Integer(プライマリキー=True)
name: str=ormar.String(max_length=40)
sort_order: int=ormar.Integer(nullable=True)
#下の新しい列
create_by:オプション[User]=ormar. ForeignKey(User,関連する名前="カテゴリ")
|
ここで、ユーザーリンク付きのサンプルデータを作成します。
| creator=await User(name="Anonymous"). save()
admin=await Role(name="admin"). save()
editor=await Role(name="editor"). save()
作成者を待っています。
await creator. role.add(エディタ)
news=await Category(name="News", sort_order=0,create_by=creator).save()
|
関連するフィールドとフィールドを組み合わせて選択し、3つのフィールドのみを選択します。
定義によれば、接続に含まれているがフィールドに参照がない各モデルは、完全に選択されている(すべてのフィールドを含む)と見なされるため、モデルによる定義も除外していることに注意してください。
!!!注ここでの他のクエリセットメソッドとは異なり、中間モデルを除外し、末尾の列を保持できます。これは、生データをモデルに解析する場合には意味がないことに注意してください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | したがって、カテゴリ->カテゴリ_x_投稿->投稿->ユーザーの関係では、除外することができます。
category_x_postとpostモデルですが、ユーザーを1つに保つことができます。(
スルーモデルとポストモデルを除外するかのように不可能なコンテキスト
カテゴリーモデルからユーザーモデルに到達する方法はないでしょう。
ユーザー=(
awaitロール。オブジェクト。関連する選択("ユーザー__カテゴリ")
. filter(name="admin")
. field({"name":.。。"users":{"name":.。。「カテゴリー」: {"name"}}})
除外フィールド("roleuser")
値リスト()
)
assert user==[("admin","Anonymous","News")]
|
クエリに複数のManyTomanyモデルがある場合は、各モデルを手動で除外する必要があります。
この負担を回避するために、ormarでは「out side_through=False」パラメータを用意しています。このフラグを「True」に設定すると、すべてのモデルが完全に除外されます。
| #上記のクエリと同等で、除外フィールドコールがないことに注意してください。
ユーザー=(
awaitロール。オブジェクト。関連する選択("ユーザー__カテゴリ")
. filter(name="admin")
. field({"name":.。。"users":{"name":.。。「カテゴリー」: {"name"}}})
. values_list(除外スルー=True)
)
assert user==[("admin","Anonymous","News")]
|
flattenを使用して値のリストを取得します。
| 複数のフィールドでflattenを使用すると例外が発生します!
awaitロール.オブジェクト.フィールド({"name", "id"}). value_list(flatten=True)
#適切な使用
ロール=awaitロール.オブジェクト.フィールド("name"). value_list(flatten=True)
assertの役割==["admin","editor"]
|
QuerysetProxyメソッド
関連するManyTomanyフィールドとReverseForeignKeyに直接アクセスする場合は、関連するモデルのリストを返します。
ただし、QuerySet APIのサブセットを公開しているため、親モデルから直接フィルタリング、作成、関連モデルの選択などを行うことができます。
!!!警告valuesとvalues_listを使用すると、モデルの解析と検証がスキップされるため、これら2つのメソッドは、querysetproxyの他のすべての読み取りメソッドと比較して、現在ロードされている関連モデルをクリアせず、独自の呼び出し結果で現在ロードされているモデルを上書きしません!
価値観
上記のvalue関数と全く同じですが、関係の反対側から関連するオブジェクトを取得することができます。
!!!ヒントQuerysetProxyの詳細については、querysetproxyセクションにアクセスしてください
値のリスト
上記のvalue_list関数とまったく同じですが、リレーションシップの反対側から関連するオブジェクトをクエリしたり、作成したりすることができます。
!!!ヒントQuerysetProxyの詳細については、querysetproxyセクションにアクセスしてください