私はどのように説明するために+5時間の訓練を受けています:Item.objects.values('type', 'state')
は2つのキーだけを含む辞書を返します。djangoの値は異常な振る舞いをしますか?
ただし、Item.objects.values('type', 'state').annotate(nb=Count('id'))
が動作します。
値関数によって返されない場合、id
属性が存在することを通訳者がどのように知っていますか?
私はどのように説明するために+5時間の訓練を受けています:Item.objects.values('type', 'state')
は2つのキーだけを含む辞書を返します。djangoの値は異常な振る舞いをしますか?
ただし、Item.objects.values('type', 'state').annotate(nb=Count('id'))
が動作します。
値関数によって返されない場合、id
属性が存在することを通訳者がどのように知っていますか?
Item.objects.values('type', 'state')
は単なる辞書ではないため、id
属性が存在することがわかります。 は、与えられたパラメータに基づいて辞書として自身を表すオブジェクトです。
の紙A
それを呼びましょう、オブジェクトは一枚の紙であると想像:
id : 1
type : cheese
state : melted
あなたはそれだけで、あなたに関連する部分を示すことによって作成され、そのオブジェクトの表現で呼び出したときに、あなたが実際に見ている何、A
の上に置く穴に一枚の紙のような紙B
:
████████████████████
████████████████████
+--------------------+
|type: cheese |
+--------------------+
+--------------------+
|state: melted |
+--------------------+
しかし、紙A
はそのまま、紙B
の下にまだあります。だからItem.objects.values('type', 'state').annotate(nb=Count('id'))
が働いています:annotate
がオブジェクトを見ると、それは実際に何を求めているのですか?はです。それは外部の観察者には見えません。換言すれば、annotate
は、A
,ではなく、の用紙B
を調べます。
オブジェクトItem.objects.values('type', 'state')
をユーザとシステムとで異なるように表現することにより、システムは、チェックする必要がある場合に備えてできるだけ多くの情報を保持することができます。 ORMモデルでは、データベースとデータベースの表現の間に矛盾が生じないように、これが一般的です。
タイプ(Item.objects.values( 'type'、 'state'))は、 – user2080105
あなたのモデルは、バックグラウンドでIDを持っており、またDjangoのORMは、モデルの定義
DjangoのORMを認識している遅延ロードあり、その結果が呼び出される前に、それは文句を言わない、何も実行しません。ですから、注釈を呼んでいる瞬間にまだ辞書ではありません。それはまだオブジェクトです。あなたは、それは結果を求める瞬間に、それはデータベースにクエリをトリガし、
DjangoのORMは、この
SELECT type, state, count(id) as nb FROM items
私の質問は簡単です。もしあなたがモデルを持っていない辞書から呼び出された場合、どうすれば 'id'の存在を知ることができるでしょうか? – user2080105
@ user2080105あなたのモデルはバックグラウンドでIDを持っていますが、Django ORMはあなたのモデル定義を認識しています。 – iklinac
Django ORMは、結果が呼び出される前は何もありません。ですから、注釈を呼んでいる瞬間にそれはまだ辞書ではありません。まだORMオブジェクトです。 – iklinac
に類似してデータベースにクエリにこれを変換あなたの結果を返す最初のクエリの辞書ない復帰を行います2つのキーで。それどころか、それはValuesQuerySetを返します。そのクエリーセットの各要素は辞書です。
他のクエリセットと同様に、ValuesQuerySetはモデルとの接続を保持しているため、必要に応じて他の要素をクエリに追加できます。クエリ全体は、クエリセットが反復されるまで実行されません。
「id」フィールドを指定しなかった場合は、問題はありません。fieldsパラメータを省略しない限り、指定したフィールドのみが返されます。https: //github.com/django/django/blob/master/django/db/models/query.pyそして最後の例をhttps://docs.djangoproject.com/en/1.10/ref/models/querysets/#で確認してください。値。あなたの最後の質問については、別の目的のために 'values'を使用しようとしているようです。 – chachan