2017-10-10 10 views
-1

私はモデルからオブジェクトをクエリする必要があります。このオブジェクトは "エクササイズ"と呼ばれ、多くのフィールド(タイトル、ボディ、回答など)を持っています。 "エクササイズオブジェクト" 1つ1つのすべてのフィールドで、それらのいくつかのレンダリングを行い、その結果として運動のpdfを返す。私がしなければDjangoオブジェクトをひとつずつ問い合わせる方法

問題は、次のとおりです。私はそれらのすべてを取得

exercises = ExerciseModel.objects.all() 

。私がしている場合:

some_exercises = ExerciseModel.objects.filter(something=something) 

私はフィルターによって「それらのいくつかを」得る。私がしなければと:

exercise = ExerciseModel.objects.get() 

私は

エラーGETを(取得)が、私はそれらを一つずつ取得できますか

つ以上の運動を返さ?私はそれらを別の関数の入力として使用できる必要があります。

+3

「すべて」または「何者」を繰り返すことができないのはなぜですか? –

+0

30,000回の演習があり、毎回30000 pdfを返すことができないので、私は任意の1つの練習をして、それを操作しなければなりません – JungleFever

+1

1つのインスタンスを取得するには、 get() '。 –

答えて

-1

.get()は、QuerySetインスタンスではなく単一のオブジェクトを返す必要があります。 1回のエクササイズを希望する場合は、.getインスタンスにパラメータを渡す必要があります。

:あなたが実際にオブジェクトを含むクエリセットを取得せずにすべてのオブジェクトを繰り返し処理したい場合は、次のコードを使用することができ

exercise = ExerciseModel.objects.get(name="an_exercise")

:たとえば、名前でオブジェクトを取得するには、次のコードを必要とします

for i in range(Exercise.objects.all().count()): 
    exercise = Exercise.objects.get(pk=i) 
    ... operate on object ... 
1

1回の練習でタスクを実行する必要がある場合は、代わりにget()を使用してください。そのような場合は、get()が1を返し、結果が1になるように条件を設定する必要があります。

例:docから

ex = ExerciseModel.objects.get(pk=123) 

は、フィールド検索に記載の形式である必要があり、所与の検索パラメータを、一致するオブジェクトを返します。

get()複数のオブジェクトが見つかった場合は、MultipleObjectsReturnedが発生します。 MultipleObjectsReturned例外は、モデルクラスの属性です。

get()は、指定されたパラメータでオブジェクトが見つからなかった場合は例外を発生させません。この例外は、モデルクラスの属性です。あなたは、基礎となるSQL要求は1行のみが返されます確実にフィルタを使用してクエリセットを持っている場合

、あなたは、クエリセットの引数なしget()を呼び出すことができます。これは、1 elemntを含むリストとして返す代わりに、モデルインスタンスとして行を返します。

オリジナルの答え:

両方filter()all()方法はQuerySetインスタンスを返します。あなたはそれぞれの「運動」のためのタスクを実行するためにそれを繰り返すことができdocumentationからリクエスト

for exercise in ExerciseModel.objects.filter(something=something): 
    # ... do what you need on your exercise 

によって返さ:

Aクエリセットは反復可能であり、それは、そのデータベースクエリを初めて実行しますそれを反復する。例えば、これは、データベース内のすべてのエントリの見出しを出力します何が必要なのイテレータにクエリセットをオンにします.iterator()ある

0

exercises = ExerciseModel.objects.all().iterator() 

は、あなたがのためにそれを反復処理を取得ループ:

for exercise in exercises: 
    ... 

これにより、多数のアイテムがある場合のパフォーマンスが向上します。しかし、それにはいくつかの欠点があります。docs

希望すると助かります!

+0

まずはお手伝いをしてくれてありがとう、私はこの方法で試しましたが、30k +エクササイズの "プール"を持っていて、1つ1つ、おそらく質問はあまり明確ではない – JungleFever

関連する問題