2017-10-10 55 views
-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,所以我必須得到一個任意的練習並且僅對其進行操作。 – JungleFever

+1

爲了得到一個單一的實例,你需要實際傳遞一些標準,例如主鍵,得到()'。 –

回答

-1

.get()必須返回一個對象,而不是QuerySet實例。如果您想要進行單個練習,那麼您必須將參數傳遞給.get實例。例如,通過名稱檢索對象需要下面的代碼:

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

如果你想通過所有的對象,而無需實際檢索包含對象的QuerySet進行迭代,你可以使用下面的代碼:

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

如果您只需要在一次練習中執行任務,請改爲使用get()。在這種情況下,您需要一個標準來確保get()將返回1且只有1個結果。

實施例:

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

doc

返回符合指定的查找參數,這應該是在查找字段中描述的格式的對象。

get()如果找到多個對象,則引發MultipleObjectsReturnedMultipleObjectsReturned異常是模型類的一個屬性。

get()如果未找到給定參數的對象,則會引發DoesNotExis t異常。這個異常是模型類的一個屬性。

當你有一個過濾器,保證了基本的SQL請求將只返回1行一個QuerySet,你可以叫get()不會對查詢集的參數。這將返回行作爲模型實例,而不是將其作爲包含1個元素的列表返回。

原來的答覆:

兩個filter()all()方法返回一個QuerySet實例。你可以在它迭代執行每個「鍛鍊」任務返回你的需求

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

documentation

一個QuerySet是可迭代,並執行它的數據庫查詢的第一次迭代它。例如,這將打印的所有條目的標題在數據庫

0

你需要的是.iterator()它會變成一個查詢集到一個迭代器:

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

那麼你得到疊代在爲循環:

for exercise in exercises: 
    ... 

,當你有大量的項目這將提高性能。然而,它也有一些缺點,以及docs

希望它有幫助!

+0

首先感謝您的幫助,我以這種方式嘗試過,但效果不佳,因爲我有一個30k +練習的「池」,我必須得到一個任意的練習,而不是所有的練習,我的不好,也許這個問題不是很清楚 – JungleFever