Django选择对象in_bulk()

时间:2011-05-06 09:45:44

标签: 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}]

3 个答案:

答案 0 :(得分:3)

首先,调用列表list是错误的,因为这是Python中的保留字(函数)。但至于你的问题,你需要做的就是首先列出你的查询,如下所示:

list2 = list(l)

或者像这样(慢一点):

list2 = [l for l in list]

然后你真的有一个真正的list对象,而不仅仅是当你打印它时出现的东西。现在你应该可以打电话了

projects = Project.objects.in_bulk(list2)

答案 1 :(得分:2)

我会这样做,使用list()

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

答案 2 :(得分: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)

请注意,项目不是一个查询集,它是一个字典,它在re:效率中呈现了它自己的一组处理问题。