ジャンゴドライ論文:F Qクエリとの問い合わせやあまり知られていない操作

クエリF

学校では、前の例で、私たちはフィルタを構成するフィールドの値は、一定の比較の私たち自身のセットのひとつです。
我々は二つのフィールドの値を比較したい場合は、どのようにそれを行うには?
DjangoはF()は、このような比較を行うために用意されています。実施例F.()は、クエリ・フィールドに同じモデルインスタンス両者の異なるフィールドを比較する値を参照することができます。

実施例1:在庫数、販売商品の数よりも大きい照会
django.db.modelsからインポートF.
RET1 = models.Product.objects.filter(maichu__gt = F( 'Kucun'))
プリント(RET1)

Fは、私たちは、私がカスタム一定の条件を考えるのではなく、私のフィルタ基準として値を対応するテーブルにフィールドを取得し、ダイナミックな比較の効果を達成するために助けることができます。

DjangoはFをサポート(、及びオブジェクトのオブジェクトと加算、減算モジュロF定数との間の()オペレーション)。これは、テーブル内の数学演算の値の型に基づいていてもよい、各項目50の価格を増加させるであろう。
models.Product.objects.update(価格= F(「価格 」)+ 50)は
、拡張:
あなたがになったcharフィールドを変更したい場合(オペレーションのタイプの額面を費やすことはありませんか!)?
以下のような:タイトルに加えて、後続のすべての「新しい」、(この文字列の連結方式スプライシング作業に必要な時間、および値スプライシング値を追加します)。
インポート、連結django.db.models.functions
値からインポートdjango.db.models
RET3 = models.Product.objects.update(名=連結方式(F.( '名前')、値( '新しい')))
連結方式表現をスプライシング操作は、文字列のパラメータは、テールスプライシングにおけるスプライスヘッドやスプライシング、新しい値にスプライスされた値を決定します。

Qクエリ

このような条件でカンマで区切られた関係とフィルタ()メソッド。あなたは(のようなORステートメント)より複雑なクエリを実行する必要がある場合は、Qオブジェクトを使用することができます。

例1:100または100未満の価格を販売するクエリの数より多い
django.db.modelsインポートQから
models.Product.objects.filter |(Q(maichu__gt = 100)Q(price__lt = 100))
1つのパッケージの条件にQは、フィルタリングとクロス比較演算子をサポートするとき。

例2:クエリ・販売在庫品目数100がゼロでない
models.Product.objects.filter(Q(kucun = 100) &〜Q(maichu = 0))
私たちは、組み合わせることができますし、&​​|演算子と括弧グループQは、任意の複雑なオブジェクトを作成します。
一方、Q〜オブジェクトは、通常と逆クエリ(NOT)クエリの組み合わせを可能にする、無効にすることができます。

例3:クエリは、新しい製品名が含まれており、在庫数が60より大きいです
models.Product.objects.filter(Q(kucun__gt = 60) 、name__contains =「 新しい」)
クエリーQを混合することができる関数オブジェクトとキーワードパラメータ。すべてのパラメータは(キーワード引数またはQオブジェクト)「AND」一緒になるクエリ機能に提供されています。Qオブジェクトが表示された場合は、それはすべてのキーワード引数を前に置く必要があります。

業務

トランザクションの定義:アトミック操作に動作SQLステートメントの複数、いずれかの成功しながら、データの整合性と一貫性を保証するために元の状態にロールバックされる故障、(NoSQLのデータベーストランザクション用にサポートされている部分) 。
トランザクション#
#は、Linuxブックの学習と少年を購入し
、データベース・レベルの時に行うには#のものを
注文データの作成#1
製品に#2は、テーブル番号1の在庫を販売する-1
django.dbから。 Fインポートモデル
django.dbインポートトランザクションから
#オープントランザクション
の試行:
transaction.atomic有する():
注文データ作成
models.Order.objects.create(NUM = "110 110 111"、PRODUCT_ID = 1、COUNT = 1)
位正常に実行することができる
models.Product.objects.filter(ID = 1).Update(kucun = F.( "kucunを") - 1、maichu = F( "maichu")+ 1)
E AS例外を除いて:
印刷(E)

その他のあまり知られて操作

DjangoのORMは、ネイティブSQLを実行します

条件の仮定は:例えば、我々は日付によるサブファイルにないブログを書き、ガーデンのブログを取りますが、年間のポイントに応じて、当社のDateFieldの時刻形式は、我々がする必要があることを意味し、日付の形式であり、再び時間は、我々はこの要求から時刻の形式を取得したいデータベース形式でデータを処理してもらうために、Djangoは方法が私たちを与えていない提供することであり、我々は独自の処理文を記述する必要があります。

ネイティブSQLの実装のORM方法

エクストラ

クエリセットに基づいて、サブステートメントを続行

余分な(自己、=なし、場所=なし、のparams =なし、テーブル=なし、ORDER_BY =なし、select_params =なしを選択)

そしてparamsは、グループであるselect_paramsのセット、及び、テーブルをするために提供されたテーブルを選択

Entry.objects.extra({ 'NEW_ID': "sometableからここothercol>%sのCOLを選択"} =を選択し、select_params =(1))

Entry.objects.extra(= [ '見出し=%S']、paramsは= [ 'レノン'])

Entry.objects.extra(= [ "FOO = 'A' ORバー= ''"、 "バズ= ''"])

Entry.objects.extra(= { 'NEW_ID': "TBからID>%sのIDを選択"}を選択し、select_paramsは=(1)、ORDER_BY = [ ' - NIDを'])

举个例子:
models.UserInfo.objects.extra(
=選択{ 'NEWID': 'app01_usertypeから選択数(1)ここで、ID>%S'}、
select_params = [1]、
ここで= [ '年齢>%sの']、
paramsは= [18]、
ORDER_BY = [' -年齢']、
テーブル= [' app01_usertype ']

""」
選択
app01_userinfo.idを、
ここでID> 1 app01_usertypeから((1カウントを選択))NEWIDとして
app01_userinfo、app01_usertypeからapp01_userinfo.age> 18 によって順app01_userinfo.age DESC ""」




ネイティブSQLの実行

ネイティブSQL文の実装で道より柔軟に

django.dbインポート接続、接続から

カーソル= connection.cursor()#カーソル=接続[ 'デフォルト']カーソル()

cursor.execute( "" "AUTH_USERからここで、ID =%sのSELECT *" ""、[1])

行= cursor.fetchone()

クエリセット方法Daquanの

より重要な方法のいくつか:
差分更新()と(保存)の
保存操作のデータの両方の修正が、(保存)機能は、すべて再びそれを再書き込み、およびアップデート()のすべてのデータ項目のデータ列ですこれは、高消費少ないため修正条項の効率化のために更新されます。だから、アップデートに保存されたデータの修正後の()。
select_relatedとprefetch_related
DEF select_related(セルフ、フィールズ*)
のパフォーマンス関連:でも、テーブルのために使い捨てに関連するデータを取得し、テーブル間の結合操作を。

总结:
1. select_related主要针一对一和多对一关系进行优化。
2. select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。

デフ(自己、*ルックアップ)prefetch_related
パフォーマンス関連:そのSQLクエリを使用し、マルチテーブルのテーブル操作が遅くなりますでも、Pythonコードでさえも動作してテーブルを達成するために複数回実行されます。
要約:
多くのフィールド(のManyToManyField)と多くの分野には多くの場合1、最適化する)(prefetch_related使用することができます。
2. prefetch_related()メソッドは、別々に、クエリの各テーブル最適化、及びその後のPythonとの関係に対処されます。

bulk_createバルク挿入データ
要件:一つは複数のデータ挿入
データ= [((範囲内のIため[STR(random.randint(65、99))4)]。) "" .joinの範囲でJ(100)のために]
obj_list = [データにおけるIためmodels.A(名= I)]
models.A.objects.bulk_create(obj_list)

Daquanの

属性とRETURN A NEWクエリセットをALTER PUBLIC方法

すべてのDEF(セルフ)
#は、すべてのデータオブジェクトを取得します

フィルターDEF(セルフ、* argsを、** kwargsから)
#クエリ条件
#条件を指定できます。パラメータ、辞書、Q

除外DEF(セルフ、* argsを、** kwargsから)
#クエリ条件
#条件を指定できます。パラメータ、辞書、Q

DEF(自己、*フィールド)select_related
もテーブルのテーブル間の結合操作、使い捨てに関連するデータを取得する:パフォーマンスに関連します。

总结:
1. select_related主要针一对一和多对一关系进行优化。
2. select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。

デフ(自己、*ルックアップ)prefetch_related
パフォーマンス関連:そのSQLクエリを使用し、マルチテーブルのテーブル操作が遅くなりますでも、Pythonコードでさえも動作してテーブルを達成するために複数回実行されます。

总结:
1. 对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。
2. prefetch_related()的优化方式是分别查询每个表,然后用Python处理他们之间的关系。

DEF(セルフ、引数*、** kwargsから)注釈を付ける
クエリを実行するためで#の重合性グループを
カウント、平均、最大インポートdjango.db.modelsから 、分、合計を

v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id'))
# SELECT u_id, COUNT(ui) AS `uid` FROM UserInfo GROUP BY u_id
v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id')).filter(uid__gt=1)
# SELECT u_id, COUNT(ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1
v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id',distinct=True)).filter(uid__gt=1)
# SELECT u_id, COUNT( DISTINCT ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1

個別のDEF(セルフ、* FIELD_NAMESである)
個別の重複排除のための#
models.UserInfo.objects.values( 'NID')個別の()。
SELECT DISTINCTのUserInfoから#NID
注意:PostgreSQLの明瞭でのみ利用可能デ重いです

デフORDER_BY(自己、* FIELD_NAMES)
用于排序
。models.UserInfo.objects.all()ORDER_BY( ' - ID'、 '年齢')

デフ余分な(自己、=なし、のparams =なし、テーブル=なし、ORDER_BY =なし、select_params =なし=なし、選択していない)
#构造额外的查询条件或者映射を、如:子查询
Entry.objects.extra(選択= { 'NEW_ID': "sometableからothercol>%sのCOLを選択"}、select_params =(1))
Entry.objects.extra(ここ= [ '見出し=%S']、paramsは= [ 'レノン'])
Entry.objects.extra(= [ "FOO = 'A' ORバー= ''"、 "バズ= ''"])
Entry.objects.extra(= { 'NEW_ID'を選択:「TBからIDを選択ここで、ID>の%s "}、select_params =(1)、ORDER_BY = [ ' - NID'])

DEF(自己)リバース:
#逆
models.UserInfo.objects.all()ORDER_BY( ' - NID')リバース()..
#注:11の複数の並べ替え降順場合がORDER_BY場合、逆は、逆であります

延期DEF(セルフ、フィールズ*):
models.UserInfo.objects.defer( 'ユーザ名'、 'ID')
または
models.UserInfo.objects.filter(...)延期( 'ユーザ名'、 'ID')。
コラム負でマッピングデータ

唯一のDEF(セルフ、フィールズ*):
は、テーブル内のデータを取る
models.UserInfo.objects.only( 'ユーザ名'、 'ID ')
または
(のみmodels.UserInfo.objects.filter(...)。 'ユーザ名'、 'ID')

デフ(自己、エイリアス)を使用して:
データベース別名のパラメータを指定します(設定で設定)

クエリセットのサブクラスを返すのpublicメソッド

デフ生(自己、raw_query、のparams =なし、翻訳=なし、使用して=なし):
执行原SQL生
models.UserInfo.objects.raw( 'userinfoをSELECT * FROM')

# 如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名
models.UserInfo.objects.raw('select id as nid from 其他表')


# 为原生SQL设置参数
models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,])


# 将获取的到列名转换为指定列名
name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)


# 指定数据库
models.UserInfo.objects.raw('select * from userinfo', using="default")
################### 原生SQL ###################
from django.db import connection, connections
cursor = connection.cursor()  # cursor = connections['default'].cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
row = cursor.fetchone() # fetchall()/fetchmany(..)

値はDEF(セルフ、フィールズ):
あたりのラインデータディクショナリ形式の取得
DEFのvalues_list(セルフ、
フィールドを、kwargsから**):
ごとのラインのデータタプルを取得

日付はDEF(セルフ、FIELD_NAME、種類、注文は=「ASC」):
を再配置するために、時間の特定の部分に基づいており、切片は、コンテンツ指定する
#種類にのみ使用できます「年」(年)、「月」(年-月)、「日」(年-月-日)
注文のみ可能#:「ASC」「DESC」
#時間と変換を取得
-年:年-01-01
-月:年-月-01
-日:年-月-日

models.DatePlus.objects.dates('ctime','day','DESC')

DEF日付時刻(セルフ、FIELD_NAME、種類、順序=なしtzinfoの=「ASC」、):
再検索し、コンテンツを特定するためにするための時間上の特定の部分の#は、指定した時間に時間を変換
#種類のみ「年」 、 "月ザ・"、 "日"、 "時"、 "分"は、 "SECONDは、"
#注文のみになります"ASC" "DESC"
タイムゾーンtzinfoの#はオブジェクト
models.DDD.objects.datetimes( 'ctimeの'、「時間を'tzinfoの= pytz.UTC)
models.DDD.objects.datetimes(' ctimeの''時間'= pytz.timezone tzinfoの('上海のアジア/「))

"""
pip3 install pytz
import pytz
pytz.all_timezones
pytz.timezone(‘Asia/Shanghai’)
"""

なしDEF(セルフ):
空のクエリセットオブジェクト

データベースクエリをDO方法

集計DEF(セルフ、引数*、** kwargsから):
アグリゲーション機能、辞書型重合結果を得た
。django.db.modelsからはカウントを、インポート平均、MAX、MIN、合計の
結果= models.UserInfo.objects.aggregate(K = COUNT( 'U_ID'、DISTINCT = TRUE)、N-COUNT =( 'NID'))
===> { 'K' :. 3、 'N-'} 4。

DEF(自己)COUNT:
は数取得
DEF GET(セルフ、* argsを、kwargsからの):
は、単一のオブジェクトを取得
作成します(セルフ、DEF
kwargsからの):
はオブジェクトが作成
DEF bulk_create(セルフ、OBJS、BATCH_SIZE =なし):
バッチインサート
挿入の数を表し#1 BATCH_SIZEを
OBJS = [
models.DDD(NAME = 'R11')、
models.DDD(NAME = 'R22')
]
models.DDD.objects.bulk_create(OBJS、10)

get_or_create DEF(セルフ、デフォルト=なし、** kwargsから):
作成するために、他の#もし存在、取得、または
作成時に指定#のデフォルトを、他のフィールドの値
= models.UserInfo.objects.get_or_create(ユーザ名=作成OBJ、 「ROOT1 'デフォルト= {'メール' :' 1111111 '' U_ID ':2' t_id「:2})

update_or_create DEF(セルフ、デフォルト=なし、** kwargsから):
存在する場合、更新、または作成
#のデフォルトが作成または更新するための時間を指定するために追加のフィールドを
OBJを、作成した= models.UserInfo.objects.update_or_create(ユーザ名= " ROOT1 'デフォルトは= {'メール ':' 1111111 '' U_ID ':2'「t_id:1})

まず、DEF(セルフ):
は、最初に取得
DEF最終(セルフ):
最後の取得します

in_bulkのDEF(セルフ、ID_LIST =なし):
ルックアップのための#主キーのID
ID_LIST = [11,21,31]
models.DDD.objects.in_bulk(ID_LIST)

削除DEF(セルフ):
削除
DEF更新(自己、** kwargsからは):
更新
DEFは(自己を)EXISTS:
結果があります

おすすめ

転載: www.cnblogs.com/bladecheng/p/11545189.html