2011-05-06 98 views
1

我試圖用in_bulk方法,雖然出了差錯Django的選擇對象in_bulk()

首先,我挑值到列表,我需要在批量選擇:

states = StateObjectRelation.objects.filter(state=int(3), content_type=int(ctype.id)) 

然後將其轉換爲清單:

list = values_list('content_id', flat=True) 

現在選擇項目in_bulk:

projects = Project.objects.in_bulk(list) 

給我下面的錯誤:

異常值:
in_bulk()必須提供ID列表。

如果我打印出在列表中的值,我得到如下:

>>> print list 
[1L] 
>>> print list.values() 
[{'state_id': 3L, 'content_id': 1L, 'id': 1L, 'content_type_id': 29L}] 
+8

'list'是內建列表類型的名稱,這樣命名變量是一個非常糟糕的想法。 – vartec 2011-05-06 10:00:30

回答

3

首先,這是一個錯誤打電話給你的列表list,因爲這是在Python中的保留字(功能)。至於你的問題,所有你需要做的是讓你的查詢列表第一,像這樣:

list2 = list(l)

或像這樣(慢):

list2 = [l for l in list]

然後你確實有一個真實的list對象,而不僅僅是當您打印時看起來像一個東西。現在,你應該能夠調用

projects = Project.objects.in_bulk(list2)

+0

我會看看我是否能想到更有效率的東西,但這不是太可怕,在你的情況下它應該沒問題。另外,正如@vartec提到的,請將您的變量名稱更改爲其他名稱。 – 2011-05-06 10:01:02

+0

爲什麼不把它包裝在'list()'中?如'list(values_list('content_id',flat = True))'。顯然你不應該調用queryset「list」... – Geekfish 2012-12-13 15:43:24

2

我想簡單地那樣做,使用list()

ids = list(your_queryset.values_list('content_id', flat=True)) 
projects = Project.objects.in_bulk(ids) 
0

我知道這已經回答了,但這些答案似乎是低效的。 的平面values_list()輸出是值的列表in_bulk()

content_id_pks = StateObjectRelation.objects.filter(state=int(3), content_type=int(ctype.id)).values_list('content_id', flat=True) 
projects = Project.objects.in_bulk(content_id_pks) 

注意項目是不是一個查詢集,它是一本字典,其中介紹一組自己的再處理問題完全可以接受的:效率。