ORMクエリ
- クエリセットオブジェクトとオブジェクト
- 1.queryset問合せセットは、サーバー上のURLコンテンツの内側に達しています。、Djangoはすぐにデータベースに照会コマンドを発行しないときDjangoは、クエリの効率を改善するために、ここでは、クエリキャッシュQerySetによって返さセットされる結果となり、つまり、あなたがこれを使用する必要がある場合にのみ、クエリセットオブジェクトを作成しますデータベースクエリを戻ってクエリセットの時間
- 2.Objectsが(モデル)Mに実装MVCフレームワークのデータ層をDjangoに、モデルは、オブジェクト・インスタンスのモデルを含む、定義済みのDjangoクエリセットタイプのオブジェクトであるオブジェクトのクラスDjangoのオブジェクトを有しています。簡単に言えば、オブジェクトは多くのオブジェクトであるクエリセット単一オブジェクトです
- 3.QuerySetは、構築濾過し、スライスし、パラメータとして渡すことができ、これらの行為は、データベースを操作する必要はありません。あなたが唯一の本当のオペレーティングデータベースのクエリを実行したときに限り、
マネージャのメソッド | 戻り値の型 | 説明 |
---|---|---|
モデルクラス.objects.all() | クエリセット | 内のすべてのデータを返します。 |
フィルタ() | クエリセット | 修飾されたデータを返します。 |
値() | ValuesQuerySet(クエリセットサブクラス) | 各要素のリストが辞書で返します。 |
values_list() | ValuesListQuerySet(クエリセットサブクラス) | 要素のリストを返しますが、それは辞書ではなく、タプル |
取得する() | オブジェクトモデル | 彼らが発見されていないオブジェクトの条件を満たしている場合.DoesNotExist異常、モデルクラスにつながる;条件を満たすようにオブジェクトを返します。それ以上が発見された場合、異常なモデルクラスを引き起こす可能性があります.MultiObjectsReturned |
最初() | オブジェクトモデル | 最初のデータを返します。 |
最終() | オブジェクトモデル | データの最後の部分を返します。 |
除外() | クエリセット | 修飾されたデータを返します。 |
ORDER_BY() | クエリセット | ソートする照会結果セット |
逆() | クエリセット | 逆転のソート結果 |
カウント() | int型 | クエリ内のオブジェクトの数を返します。 |
()が存在します | BOOL | データはの存在を決定するかどうかを照会します |
-
1.len()とcount()
- クエリセット)はQuerySet.count(とそうでない場合、値を(それは評価される)、懇願要素の数を取得されていない限り、コンピューティング要素クエリセットではなく、推奨LEN()の数は、効率が(特に大量のデータに、はるかに高いです何千もの)時間
-
2.Ifはクエリセット:与QuerySet.exists場合は()
- また、我々はお勧めしません
if QuerySet
空気かどうかを判断するには、この方法を、しかし、あなたはQuerySet.exists()、高いクエリの効率を使用する必要があります
- また、我々はお勧めしません
3.Fクラス
from django.db import models
from django.db.models import F
class User(models.Model):
name = models.CharField(max_length=10)
age = models.IntegerField()
both = models.CharField(max_length=20)
)(Fを使用しないでください
s = User.objects.get(name='xxx')
s.age += 1
s.save()
次に、オブジェクトメモリーにデータベースから検索し、計数し、データベースに格納されています
)(Fを使用して、
s = User.objects.get(name='xxx')
s.age = F('age') + 1
s.save()
、データベース内のデータを直接特定し、カウントした後、データベースを変更
-
- クラスQが - に対応(および/または/ではありません)
- 論理的関係またはを待っているがある場合は、Qクラスを使用します
- フィルタ条件は、オブジェクトQと非Qクエリを混合使用することができますが、混合クエリーQは、オブジェクトの前に置くために、あなたはQオブジェクトを使用するので、もし、必然的に、順序とエラーが忘れてしまうので、これは、推奨されません、それはすべてでありますQオブジェクト
- Qオブジェクト()することができますが、我々はまた、使用することができますまたは非、対応するシンボルが各条件の元フィルタはQに入れたです、また、非常にシンプルである「|」と「&」や「〜」、およびこれらの論理演算は、コンマ、各グループのコネクタの基本的な条件であり、その関係は、実際には、使用することができる代わりの&(Pythonのmanage.pyシェルで試験し、代わりに&コンマれる、SQLの実行は、さらに、オブジェクトまたは1つのQを返します)同じですが、その場合には貧しい可読性、私たちに直接SQLを記述するために、この時間、そして時に改行と条件の各セット、のように、明確なロジックになります
>>> python manage.py shell
>>> from django.db.models import Q
>>> Poll.objects.get( Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
question__startswith='Who') # 正确,但不要这样混用
>>> Poll.objects.get( Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
Q(question__startswith='Who')) # 推荐,全部是Q对象
>>> Poll.objects.get( (Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))&
Q(question__startswith='Who')) # 与上面语句同意,&代替”,”,可读性差
興味を持っている??クラスQを試すことができたときにFクラスは、それを使用することができるはずです
- 注釈を付ける(無対応するSQLキーワードで)
- 機能
annotate(*args, **kwargs)
:クエリセットを返します - 各モデルインスタンスにクエリセットは注釈ので、重合することができる唯一の機能によってグループが使用され、フィールドの値は、集約関数が使用されている、1つまたは複数のフィールドを追加しています。すなわち、集約関数で、DjangoのOneToOne、OneToManyため、フィルタとして重合対応テーブルとして機能する、多対多リレーショナルクエリと提供されるような逆も同様に関連することができ
- 機能
例:
from django.db.models import Count
s = User.objects.all().annotate(n=Count('age'))
-
5.order_by()
- 直接フィールド名があれば、それは、ASCを昇順に配置され、第一のフィールド名場合 - DESCを降順
- リターンクエリセット
-
6.distinct()
- 一般値()、一緒に使用values_list()は、それがValuesQuerySetを返し、ValuesListQuerySetこのクラスは、各要素が辞書であるリストと非常に類似しています
- これは、引数(実際には、パラメータがありますが、パラメータは唯一のPostgreSQL上で動作)ではありません
。例:
s = User.objects.values('name').distinct()
- 7.aggregate
-
aggregate(*args,**kwargs)
:パラメータは、重合の関数で好ましく使用される**kwargs
名前から各パラメータのための形態で - 各グループの集計注釈結合当量()及びGROUP_BY集約()関数を実行します。別の集計は、()GROUP_BYしませんが
-
from django.db.models import Count
# 这是用*args的形式,最好不要这样用
s = User.objects.aggregate(Count('name'))
# 这是用**kwargs的形式
s = User.objects.aggregate(n=Count('name'))
-
8.ファジィクエリ
-
gt/gte/lt/lte
対応>,>=,<,<=
:ダブル下線のフィールド名-
age__gt=18
:18歳以上
-
-
in
二重下線のフィールド名:中の対応 -
contains/startswith/endswith
二重下線のフィールド名:のような対応 -
range
対応between and
:ダブル下線のフィールド名、額面リストの後に範囲
-
-
- 余分な()
extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
- 複合体を実装する場合の言葉は、そのような選択、またはテーブルなどの追加一つ以上のパラメータparamsを指定することができます。すべてのパラメータはオプションですが、少なくとも、あなたが使用したい
簡単な例を:
s = User.objects.extra(select={'is_recent':"both>'2000-01-01'"})s
ます。https://www.jianshu.com/p/80a6e504c11aで再現