2015-08-27 3 views
2

При использовании запросов django. Возможно ли использовать операцию in или другой метод для поддержания взаимно однозначного отображения между объектами.Django in query

Например, я хотел бы:

id_list = [12,2,33] Foo.objects.filter(id__in=id_list)

Чтобы сохранить порядок и вернуть None, когда один из идентификаторов отсутствует, например:

ret = [Foo(id=12), None, Foo(id=33)]

где Foo(id=2) не существует.

В настоящее время единственным способом, который я делаю, является создание промежуточного словаря. Например:

map = {o.id: o for o in Foo.objects.filter(id__in=id_list)} 
ret = [map.get(id, None) for id in id_list] 
+0

Вы также можете добавить ModelMethod таким образом, что-то вроде 'RET = [Foo.objects.get_or_none (ID = идентификатор) для идентификатора в ID_LIST]' будет работать. – Jkdc

ответ

2

Существует не простой способ извлечения экземпляров в порядке, и необходимость возвращения None для отсутствующих объектов делает его еще сложнее.

Вы можете использовать in_bulk(), чтобы упростить код.

bulk_foos = Foo.objects.in_bulk(id_list) # returns a dict of foos, keyed on id 
ordered_foos = [bulk_foos.get(foo_id, None) for foo_id in id_list)]