我正在尝试使用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}]
答案 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:效率中呈现了它自己的一组处理问题。