2017-01-21 15 views
2

を照会します明らかに私の意図であったモデルBとCのすべてのインスタンスをロードします。ジャンゴ選択フィールドは、私は、モデルAのためのモデル選択フィールドを有するフォームのモデルA.</p> <p>を延長両方二つのモデル、モデルBとモデルCを有する

このドロップダウンは1000個以上のAオブジェクトです。私はhasattr()を使用してBまたはCであるかどうかを判断しています。これらは、これらのクラスのユニコードメソッドを使用して、ドロップダウンから文字列内のオブジェクトを表示します。

これは、処理に数分かかるSQLクエリを何千も作成します。今、私のソリューションは、データベースを3回クエリすることです(すべてのA、B、Cオブジェクトを取得し、Aをループして各オブジェクトがBまたはC型かどうかを判断し、正しいユニコード文字列を使用するリストにプッシュします)。

私は、何千ものモデルオブジェクトを使ってドロップダウンをポピュレートする効率的な方法を知っているのだろうかと思っていたのですが、私はデータを消去し、フォームを保存するときに正しいオブジェクトを選択しました。選択肢そのモデルは他のモデルのベースモデルである。

乾杯、 ディーン

+0

ユニコードメソッドは正確に何をしますか?彼らは余分なクエリを引き起こすべきではありません – Sayse

+0

BまたはCのオブジェクトには、他のモデルへの外部キーフィールドがあります。 - unicodeはこれらの他のモデルからフィールドを取得します(self.foreign_key_field.field_to_print_out)。たとえば、1つのオブジェクトがタイプB(拡張A)で、このオブジェクトを最もよく表している(外来キーを介して関連している)モデルXのフィールドを出力したいとします。 select_related()はここに出現するでしょうか? (ps。私はDjangoを初めて使っています) –

+0

正しいですが、元の長い土曜日の夜と完全に間違っていたので、答えを書き直しました。うまくいけば、1kのクエリがどこからくるのかを説明してください。 – Sayse

答えて

0

Unicodeは、これらの他のmodからフィールドを取得しますels(self.foreign_key_field.field_to_print_out)。

これは、他のクエリが行われる場所です。ユニコードの呼び出しや、そのaまたはbのチェックが行われる場所ではありません。

ユニコードメソッドがローカルフィールドのみを参照していても、これは問題ではありませんでしたが、参加が必要なフィールドに気付いたように、必要でないものについてもパフォーマンスを保存するために自動的に行われません。

django-debug-toolbarを使用する場合、1000クエリはオブジェクトのリストではなく、関連オブジェクトの取得であることに注意してください。

だから、あなたが指摘したように、select_relatedは、あなたがこれらのフィールドを必要としていることをdjangoに伝えているので、ここで助けになります。

+0

残念ながら1k +のアイテムが必要です。ユーザーは、全国的な価値観にアクセスする必要があります。私はこれのUIの視点を管理するselect2のためのdjangoライブラリを使用しています。あなたはここでどのようにアノテーションが働いているのか説明できますか?私はそれを把握することはできません(私は複雑なクエリで多くの経験を持っていない) –

+0

これはまだ各オブジェクトのDBを一度ヒットしていない?それはまだデータベースへの千のクエリの上になるでしょう... –

+0

もう一度私は注釈がどのように動作するのかについて完全にはあまり確信していませんが、限り私はmy_querysetが 'A.objects.all()'この注釈が行うすべての操作は、タイプがbまたはcかどうかを確認する方法を提供します。どのようにして、A型のすべてのオブジェクトと_unicode__表現を1つのクエリで得ることができますか? –

関連する問題