2011-05-06 48 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) 

注意项目是不是一个查询集,它是一本字典,其中介绍一组自己的再处理问题完全可以接受的:效率。