Django selecting objects in_bulk()
I am trying to use in_bulk method, although something goes wrong
First I pick values into list that I need to select in bulk:
states = StateObjectRelation.objects.filter(state=int(3), content_type=int(ctype.id))
Then convert them to list:
list = values_list('content_id', flat=True)
Now selecting the items in_bulk:
projects = Project.objects.in_bulk(list)
Give me the following error:
Exception Value:
in_bulk() must be provided with a list of IDs.If i print out the values that are in list I get the following:
>>> print list
[1L]
>>> print list.values()
[{'state_id': 3L, 'con开发者_Python百科tent_id': 1L, 'id': 1L, 'content_type_id': 29L}]
Firstly, it's a mistake to call your list list
, since that's a reserved word (function) in Python. But as for your question, all you need to do is make a list of your query first, like this:
list2 = list(l)
or like this (slower):
list2 = [l for l in list]
Then you really have a real list
object, and not just something that appears like one when you print it. Now you should be able to call
projects = Project.objects.in_bulk(list2)
I would simply do it like that, using list()
:
ids = list(your_queryset.values_list('content_id', flat=True))
projects = Project.objects.in_bulk(ids)
I know this has been answered, but these answers seem to be inefficient.
The output of a flat values_list()
is perfectly acceptable as the list of values for 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)
Note that projects isn't a queryset, it's a dictionary, which presents it's own set of handling problems in re: efficiency.
精彩评论