ORMのクエリの最適化
のみ与延期
res = models.Book.objects.all()
ORMは、不活性クエリであるため、だから、データベース上の圧力を低下させる、不要なデータベース操作を減らし、任意のリターン結果がありません。
これは、データベースたら行くために少し少なめに行くことができ、データベースが離れて行くか、一度ことをしないことが最善です。
唯一の最適化:
res = models.Book.objects.only('title') # 括号内查询的字段可以有多个
print(res) # 查询一次,打印一条sql查询语句
for i in res:
print(i.title) # 查询一次,打印一条sql查询语句
print(i.price) # 有几个对象,就查询几次,打印几条sql查询语句
括弧内にのみ物体視野点ブラケットにより、クエリによって返されるオブジェクトへのパッケージの値は、ますのフィールドに対応する、データベースクエリを歩く直接結果を返す必要はありません、あなたはフィールドには括弧内に頻繁に離れて行くされていません指したらデータベースクエリ
延期の最適化
res = models.Book.objects.defer('title')
# print(res)
for i in res:
# print(i.title)
print(i.title)
そしてコントラストのみ、括弧内のフィールドが延期に対応する値以外の分野を除外します、カプセル化は、あなたのオブジェクトに戻り、他のフィールドでは、括弧内のフィールドを指したら、ポイントデータベースクエリを歩く必要はありません数回どのくらいの値を照会します
select_related和prefetch_related
select_related最適化
res = models.Book.objects.select_related('publish')
# print(res)
for i in res:
print(i.publish)
Select_relatedは、括弧外部キーフィールドに入れ、外部キーフィールドの種類とのみ1対多、多対になりません
内部テーブルは、オブジェクトに一つによってパッケージ1のうち、テーブルにこのキーフィールドの内部で、括弧自動スプライシングテーブル外クエリデータテーブルに関連する、動作テーブルで自動的に行わ。そうすることで、データベースへの圧力を軽減するために、データベースゴーを繰り返すことはありません。
複数のブラケットは、カンマで開くように、select_related外部キー・フィールド内に配置することができ、テーブルの関連する外部キーフィールドは、大きなテーブルに組み込ま複数あろう
prefetch_related最適化
res = models.Book.objects.prefetch_related('publish','authors')
for i in res:
print(i.publish)
- 内部には、自動的にクエリ複数のテーブル、およびパッケージにクエリオブジェクトの結果の手順に従って、サブクエリをprefetch_relatedようにユーザの感情やリンクテーブル運転。
- 転送のサポート、複数の外部キーフィールド、およびタイプに制限はありませんがブラケット。
- それぞれの外部キーフィールドを入れて、それは、より多くのSQL文よりもマルチテーブルクエリがかかります
MTVとMVCモデル
MTVモデルとして知られているDjangoは、実際には、本質的には、MVCモデルであります
MTV:モデルテンプレートビュー
MVC:モデルビューコントローラ(経路一致)
パラメータの選択
choices = (
(1,'male'),
(2,'female'),
(3,'others')
)
gender = models.IntegerField(choices=choices)
from app01 import models
user_obj = models.Userinfo.objects.filter(pk=4).first()
print(user_obj.username)
print(user_obj.gender)
# 针对choices字段 如果你想要获取数字所对应的中文 你不能直接点字段
# 固定句式 数据对象.get_字段名_display() 当没有对应关系的时候 该句式获取到的还是数字
print(user_obj.get_gender_display())