2015-08-27 75 views
2

使用django查詢集時。有可能使用in操作或其他方法來維護對象之間的一對一映射。查詢中的Django

比如我想:

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

爲了維持秩序,並返回None當IDS之一是缺少,如:

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),用於ID_LIST ID]'會的工作。 – 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)]