I.はじめに
DjangoのORMフレームワークは、データベーステーブルデータをクエリするための多くのメソッドを提供し、異なるメソッドは異なる結果を返します。異なるメソッドには、対応する独自の使用シナリオがあります。
一般的に使用される主なクエリメソッドは13で、特性に応じて次の4つのカテゴリに分類されます。
- メソッドの戻り値は、反復可能なオブジェクトQuerySetです。all()、filter()、exclude()、order_by()、reverse()、values()、values_list()、distinct();
- メソッドの戻り値は単一のオブジェクトです:get()、first()、last();
- メソッドの戻り値はブール値です:exists();
- メソッドの戻り値は数値です。count();
詳細:
①。djangoなどのWeb開発フレームワークを学ぶと、フレームワークは開発者の90%が使用する多くの堅牢なカプセル化メソッドを提供し、各メソッドは対応する機能を実現できるため、開発者は作成に多くの時間を費やす必要がありません。これらの同様の方法は、ホイールの再作成も回避し、開発者自身が作成したホイールは一般に堅牢ではなく、多くのシナリオに適していません。したがって、フレームワークを使用する私たちにとって、フレームワークが提供するメソッドと、各メソッドの使用方法の具体例を知っていると、ビジネス開発を簡単に実行できます。
2.データの準備
これら13のクエリ方法を実際の例と組み合わせて使用する方法を確認するには、事前に指定したデータテーブルにデータを作成する必要があります。
したがって、[hello_person]テーブルの3つのデータをテストデータとして使用することにしました。
第3に、メソッドの戻り値は、反復可能オブジェクトQuerySetの各クエリメソッドがどのように使用されたかの完全な記録です。
詳細:
①。以前のインターフェースのデバッグにより、ビュー関数[search_person]を正常に呼び出して、期待される結果値を返すことができることがわかりました。したがって、クエリメソッドを検証するたびに、ビュー関数[search_person]で関連するコードロジックを変更することで検証できます。
1.クエリメソッド[all()]がどのように使用されたかの完全な記録
詳細:
①。まず、データテーブル[hello_person]のすべてのデータをクエリするネイティブSQLステートメントは次のとおりです。select* fromhello_peroson。
②。ただし、ORMフレームワークが提供するメソッドでネイティブSQL文を記述する必要はありません。たとえば、このコード行を実行すると、[allData =データテーブルに対応するクラス名。objects.all()]が可能になります。これを返すテーブル内のすべてのデータ、つまり、すべてのデータはこの変数[allData]に格納されます。変数[allData]は反復可能なオブジェクトQuerySetです。つまり、変数[allData]は反復可能なオブジェクトであることを覚えておく必要があります。現時点では、直接与えられるのではなく、すべてのデータを返しますが、間接的にすべてのデータを返します。反復可能オブジェクト[allData]内の特定のデータテーブルデータを取得する場合は、forループを使用して読み取る必要があります。これは、forループがリストと辞書、およびプリミティブオブジェクトと反復可能オブジェクトの反復可能データを処理するために特に使用されるためです。 。の種類!
③。反復可能オブジェクトQuerySetの予備理解:Python言語の反復可能オブジェクトQuerySetは、Java言語の結果セットと見なすことができ、結果セットはリストと見なすことができます。結果セットの機能は、格納することです。それぞれの異なるオブジェクト/異なる祖先/異なる辞書。また、各オブジェクトのメモリアドレスが一意であるため、各オブジェクトが一意であることがわかります。各クラスが一度インスタンス化されると、対応するオブジェクトが生成されます。オブジェクトを介してクラス内の関連するクラス属性を呼び出すことができます。必要な特定のデータテーブルデータを取得します。
④.ORMフレームワークが提供する[all()]メソッドの戻り値は、リストに似た反復可能なオブジェクトQuerySet型データです。この反復可能なオブジェクトQuerySetタイプのデータの各データは、モデルクラスのオブジェクトです。
⑤質問:データテーブルから取得したデータを格納するために、基本的に結果セットが使用されるのはなぜですか?
おそらく答え:
データテーブルに100,000個のデータがある場合、結果セットには100,000個の異なるオブジェクトが含まれている必要があります。各オブジェクトを介して、後でこのデータテーブルデータの対応するテーブルフィールドデータを取得すると便利です。
Djangoは、[all()]メソッドによって返される反復可能オブジェクトのQuerySetタイプのデータをキャッシュして、クエリの効率を向上させます。つまり、反復オブジェクトQuerySetを作成するとき、Djangoはデータベースにクエリコマンドをすぐに発行せず、対応するデータの各テーブルデータに対応する異なるモデルクラスオブジェクトを、使用する必要がある場合にのみ取得します。反復オブジェクトQuerySet(forループを介してモデルクラスのオブジェクトを呼び出す)が、関連するメソッドまたはモデルクラスオブジェクトの関連するクラス属性の呼び出しをトリガーして、関連するSQLステートメントのクエリコマンドを実行する場合のみ。
質問:オブジェクトを格納するために使用される結果セットの機能を、より現実的なコピーライティングでどのように説明しますか?
おそらく答え:
たとえば、データテーブルAには10個のデータがあり、データテーブルAの各データは結果と見なされるため、それぞれの異なるオブジェクトを使用して、それぞれの異なる結果をロードする必要があります。
例:車は人を保持し、オブジェクトは結果を保持します。
そして今、10人の異なる人々がいて、10人の異なる車が必要でなければなりません。
結果セットは、大きな積載コンテナとして理解でき、このコンテナを介して10台の車両を積載できます。
最終的に、このコンテナーを取得しました。[forループ]コンテナーオープニングツールを使用して、車内のすべての人と各人のさまざまな特定のデータをすべて取得できます。
質問:たとえば、データテーブルAに10,000個のテーブルデータがあり、このデータテーブルAのすべてのテーブルフィールドの特定の値を取得したいとします。次の2つの解決策があります。
解決策1:ネイティブのaqlステートメントを自分で直接記述し、これらの10,000個のデータのすべてのテーブルフィールド値の特定の値を直接返します。
解決策2:ormフレームワークによって提供されるメソッドall()を使用して、10,000個のデータに対応するオブジェクトを含む結果セットを返し、そのオブジェクトを使用して、関連するクラス属性またはメソッドを呼び出して、テーブルの特定の値を取得しますフィールド値。
すみません、どのプランを使うべきですか?
おそらく答え:
Java言語またはPython言語のどちらに基づいている場合でも、既存のフレームワークの設計はORMに基づいています。つまり、データはオブジェクトを自動的にマップします。ビジネス開発プロセスでは、すべての操作はオブジェクト操作にも基づいています。 ORMの原則に沿っています。
Java関連のように:Mybatis、JPA、springJDBC、Python関連のように:django、これらのフレームワークに含まれるデータベース操作はすべてORMに基づいています。
テーブルデータを直接取得する場合は、通常、ネイティブのJDBCまたはSQLステートメントを実装できますが、これはオブジェクト操作に基づくものではなく、ORMの原則に準拠していません。
したがって、スキーム1とスキーム2の両方を採用することができますが、オブジェクト操作の観点から、主流はスキーム1を採用します。
1.1。最初のステップ:反復可能なオブジェクトの値を出力できます。
1.2。2番目のステップ:クエリメソッド[all()]の特定の使用。
関連コード:
# 该视图函数作用:按照不同条件,来获取person表指定的数据
def search_person(request):
# 1.通过方法all()间接获取到hello_person表里的三个表字段id,name,age的所有数据
# 第一步:新增三个数据类型为str的变量,初始值都设置为空,用于后续存储数据;
ids = ''
names = ''
ages = ''
# 第二步:通过调用方法all(),返回一个数据类型为可迭代对象QuerySet的变量res;
res = Person.objects.all()
# 第三步:通过for循环,获取我们想要的数据;
for i in res:
ids = ids + " " + str(i.id) # 我们把表字段id的值都存储在变量ids;
names = names + " " + i.name # 我们把表字段name的值都存储在变量names;
ages = ages + " " + str(i.age) # 我们把表字段age的值都存储在变量ages;
# 第四步:把数据返回给前端页面;
return HttpResponse('''
表字段id所有的值汇总:%s;<br/>
表字段name所有的值汇总:%s;<br/>
表字段ages所有的值汇总:%s;<br/>
''' % (ids, names, ages))
2.クエリメソッド[filter()]がどのように使用されたかの完全な記録
詳細:
①。まず、データテーブル[hello_person]内の適格なデータをクエリするためのネイティブSQLステートメントは、一般的に次のようになります。select* from hello_peroson where id = 2。
②.①の機能は、ORMフレームワークが提供する[filter()]メソッドでも迅速に実現できます。
③。[filter()]メソッドの戻り値は、リストに似た反復可能なオブジェクトのQuerySet型データです。この反復可能なオブジェクトQuerySetタイプのデータの各データは、モデルクラスのオブジェクトです。
2.1。最初のステップ:クエリメソッド[fliter()]の特定の使用。
詳細:
①。メソッドfitter()のパラメータ受け渡しルール。
3.クエリメソッド[exclude()]がどのように使用されたかの完全な記録
詳細:
①。[exclude()]メソッドの戻り値も反復可能なオブジェクトQuerySetであり、戻り値はクエリ条件を満たさないデータです。
②。[exclude()]実際の開発ではめったに使用されず、[filter()]メソッドが基本的に使用されます。
②。[exclude()]メソッドの戻り値は、リストに似た反復可能なオブジェクトのQuerySet型データです。この反復可能なオブジェクトQuerySetタイプのデータの各データは、モデルクラスのオブジェクトです。
クエリメソッド[exclude()]の特定の使用法。
関連コード:
# 该视图函数作用:按照不同条件,来获取person表指定的数据
def search_person(request):
# 3、方法exclude()的实际使用例子
print("================================开始====================================")
res1 = Person.objects.exclude(id=1)
print(res1)
print("===============================分割线1==================================")
res2 = Person.objects.exclude(id=3)
print(res2)
print("===============================分割线2==================================")
return HttpResponse("查询成功!")
4.クエリメソッド[order_by()]がどのように使用されたかの完全な記録
詳細:
①。[order_by()]メソッドの戻り値も反復可能なオブジェクトQuerySetであり、戻り値はソート条件を満たすデータです。
②。[order_by()]メソッドの戻り値は、リストに似た反復可能なオブジェクトのQuerySet型データです。この反復可能なオブジェクトQuerySetタイプのデータの各データは、モデルクラスのオブジェクトです。
③。参加の際の注意点:
- パラメータのフィールド名は引用符で囲む必要があります。
- 降順機能を実装する場合は、フィールド名の前にマイナス記号[-]を付けてください。
クエリメソッド[order_by()]の特定の使用法。
関連コード:
def search_person(request):
# 4、方法order_by()的实际使用例子
print("================================开始====================================")
res1 = Person.objects.order_by("id")
print(res1)
print("================================分割线1==================================")
res2 = Person.objects.order_by("-id")
print(res2)
print("================================分割线2==================================")
return HttpResponse("查询成功!")
5.クエリメソッド[reverse()]がどのように使用されたかの完全な記録
詳細:
①。[reverse()]メソッドの戻り値も反復可能なオブジェクトQuerySetであり、[reverse()]メソッドはクエリ結果を逆にするために使用されます。
②。[reverse()]このメソッドは実際の開発ではほとんど使用されず、[order_by()]メソッドが基本的に使用されます。
③。[reverse()]メソッドの戻り値は、リストに似た反復可能なオブジェクトのQuerySet型データです。この反復可能なオブジェクトQuerySetタイプのデータの各データは、モデルクラスのオブジェクトです。
クエリメソッド[reverse()]の特定の使用法。
関連コード:
def search_person(request):
# 5、方法reverse()的实际使用例子
print("================================开始====================================")
# 按照id升序排列:降序再反转就变成了正序
res1 = Person.objects.order_by("-id").reverse()
print(res1)
print("================================分割线===================================")
return HttpResponse("查询成功!")
6.クエリメソッド[values()]がどのように使用されたかの完全な記録
詳細:
①。[values()]メソッドの戻り値も反復可能なオブジェクトQuerySetであり、[values()]メソッドは一部またはすべてのフィールドのデータをクエリするために使用されます。
②。すべてのフィールドのデータをクエリする場合は、[values()]メソッドの入力パラメータフィールドの数を0にする必要があります。
③。[values()]メソッドの戻り値は、リストに似た反復可能なオブジェクトのQuerySet型データです。この反復可能なオブジェクトQuerySetタイプのデータの各データは、モデルクラスのオブジェクトではなく、反復可能なディクショナリです。ディクショナリのキーはテーブルフィールドであり、値はテーブルフィールドに対応するデータです。
クエリメソッド[values()]の特定の使用法。
関連コード:
def search_person(request):
# 6、方法value()的实际使用例子
print("================================开始====================================")
# 查询所有的id字段和name字段的数据
res = Person.objects.order_by("-id").values("id", "name")
print(res)
# 得到第一条记录的表字段id的值
print(res[0]["id"])
# 得到第一条记录的表字段name的值
print(res[0]["name"])
print(type(res))
print("================================分割线===================================")
return HttpResponse("查询成功!")
7.クエリメソッドの使用方法の完全な記録[values_list()]
詳細:
①。[values_list()]メソッドの戻り値も反復可能なオブジェクトQuerySetですが、[values_list()]メソッドは一部またはすべてのフィールドのデータをクエリするために使用されます。
②。すべてのフィールドのデータをクエリする場合は、[values_list()]メソッドの入力パラメータフィールドの数を0にする必要があります。
③。[values_list()]メソッドの戻り値は、リストに似た反復可能なオブジェクトのQuerySet型データです。この反復可能なオブジェクトQuerySetタイプのデータの各データは、モデルクラスのオブジェクトではなく、プリミティブの祖先です。タプルは、クエリテーブルフィールドに対応するデータを配置します。
クエリメソッド[values_list()]の特定の使用法。
関連コード:
def search_person(request):
# 7、方法values_list()的实际使用例子
print("================================分割线1===================================")
# 查询所有的id字段和name字段的数据
res = Person.objects.values_list("id", "name")
print(res)
print(type(res))
print(res[0][0])
print(res[0][1])
print("================================分割线2===================================")
res = Person.objects.values_list()
print(res)
print(type(res))
print(res[0][0])
print(res[0][1])
print("================================分割线3===================================")
return HttpResponse("查询成功!")
8.詳細:
①。[distinct()]メソッドの戻り値も反復可能なQuerySetです。
②。[distinct()]メソッドの戻り値は、リストに似た反復可能なオブジェクトのQuerySet型データです。この反復可能なオブジェクトQuerySetタイプのデータの各データは、モデルクラスのオブジェクトではなく、各タプルであり、クエリフィールドに対応するデータはタプルに配置されます。
③。[distinct()]各オブジェクトは異なる存在であるため、このメソッドはモデルクラスのオブジェクトを重複排除する意味がありません。したがって、[distinct()]メソッドは通常[values]メソッドまたは[values_list]メソッドと一緒に使用されますが、[all()]メソッドと一緒に使用すると重複排除の効果は得られません。
④。メソッドの[distinct()]関数:データの重複排除に使用されます。
クエリメソッド[distinct()]の特定の使用法。
第4に、メソッドの戻り値は、単一オブジェクトの各クエリメソッドがどのように使用されたかの完全な記録です。
1.クエリメソッド[get()]の使用方法の完全な記録
詳細:
①。[get()]メソッドの戻り値はモデルクラスのオブジェクトです。
②。[get()]このメソッドは、返されたモデルクラスの適格なオブジェクトをクエリするために使用され、適格なオブジェクトは1つしか存在できません。適格なオブジェクトが複数あるか、まったくない場合、エラーがスローされます。
クエリメソッド[get()]の特定の使用法。
関連コード:
def search_person(request):
# 方法get()的实际使用例子
print("================================分割线1===================================")
# 正例场景:符合条件的对象只有一个
res = Person.objects.get(id=2)
print(res)
print(type(res))
id = res.id
name = res.name
age = res.age
print(id)
print(name)
print(age)
print("================================分割线2===================================")
try:
# 反例场景:符合条件的对象有2个
res = Person.objects.get(age=28)
print(res)
except Exception as e:
print(e)
print(type(e))
print("符合条件的对象不是1个,是2个")
print("================================分割线3===================================")
try:
# 反例场景2:符合条件的对象有2个
res = Person.objects.get(id=99898)
except Exception as e:
print(e)
print(type(e))
print("符合条件的对象不是1个,是0个")
print("================================分割线4===================================")
return HttpResponse("查询成功!")
4.2。クエリメソッド[first()]がどのように使用されたかの完全な記録
詳細:
①。[first()]メソッドは、クエリ条件を満たす結果の最初のデータを返します。返されたデータは、モデルクラスのオブジェクトです。
クエリメソッド[first()]の特定の使用法。
関連コード
def search_person(request):
# 方法first()的实际使用例子
print("================================分割线1===================================")
# 返回符合查询条件的第一条数据
res = Person.objects.filter(age=28).first()
print(res)
print(type(res))
id = res.id
age = res.age
name = res.name
print(id)
print(age)
print(name)
print("================================分割线2===================================")
return HttpResponse("查询成功!")
4.3。クエリメソッド[last()]がどのように使用されたかの完全な記録
詳細:
①。[last()]メソッドは、クエリ条件を満たす結果の最後のデータを返します。返されたデータは、モデルクラスのオブジェクトです。
クエリメソッド[last()]の特定の使用法。
関連コード:
def search_person(request):
# 方法last()的实际使用例子
print("================================分割线1===================================")
# 返回符合查询条件的最后一条数据
res = Person.objects.all().last()
print(res)
print(type(res))
id = res.id
age = res.age
name = res.name
print(id)
print(age)
print(name)
print("================================分割线2===================================")
return HttpResponse("查询成功!")
第5に、メソッドの戻り値は、各クエリメソッドがブール値でどのように使用されているかを完全に記録したものです。
1.クエリメソッド[exists()]がどのように使用されたかの完全な記録
詳細:
①。[exists()]メソッドは、クエリ結果のQuerySetリストにデータがあるかどうかを判断するために使用されます。
②。[exists()]メソッドの戻り値のデータ型はブール値で、データがある場合はtrue、データがない場合はfalseです。
クエリメソッド[get()]の特定の使用法。
関連コード:
def search_person(request):
# 方法exists()的实际使用例子
print("================================分割线1===================================")
res = Person.objects.all().exists()
print(res)
print("================================分割线2===================================")
res = Person.objects.filter(id=9995).exists()
print(res)
print("================================分割线2===================================")
return HttpResponse("查询成功!")
第6に、メソッドの戻り値は、各クエリメソッドが数値でどのように使用されているかを完全に記録したものです。
1.クエリメソッド[count()]がどのように使用されたかの完全な記録
詳細:
①。[count()]メソッドはデータ数のクエリに使用され、返されるデータは整数です。
クエリメソッド[count()]の特定の使用法。
関連コード:
def search_person(request):
# 方法count()的实际使用例子
print("================================分割线1===================================")
res = Person.objects.all().count()
print(res)
print("================================分割线2===================================")
res = Person.objects.filter(id=9878).count()
print(res)
print("================================分割线3===================================")
return HttpResponse("查询成功!")
7.関連する学習資料のアドレス
①.djangoのORMフレームワークによって提供されるデータベーステーブルデータをクエリするすべての方法の特定の使用法については、新人チュートリアルアドレスを表示できます:https://www.runoob.com/django/django-orm-1.html