¿Cómo puedo filtrar una consulta de Django con una lista de valores?

290

Estoy seguro de que esta es una operación trivial, pero no puedo entender cómo se hace.

Tiene que haber algo más inteligente que esto:

ids = [1, 3, 6, 7, 9]

for id in ids:
    MyModel.objects.filter(pk=id)

Estoy buscando obtenerlos todos en una consulta con algo como:

MyModel.objects.filter(pk=[1, 3, 6, 7, 9])

¿Cómo puedo filtrar una consulta de Django con una lista de valores?

ajwood
fuente

Respuestas:

538

De la documentación de Django :

Blog.objects.filter(pk__in=[1, 4, 7])
charlax
fuente
¿Aparecerá un error si pasamos la lista vacía o no devolvemos ningún registro?
Rakmo
@OmkarDeshpande No
DylanYoung
@DylanYoung Entonces no devolverá ningún récord
Rakmo
2
@OmkarDeshpande Exactamente. Sin embargo, si llama get(), obtendrá un error ObjectDoesNotExist, por supuesto.
DylanYoung
48

Cuando tiene una lista de elementos y desea verificar los posibles valores de la lista, no puede usarlos =.

La consulta sql será como lo SELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9]que no es cierto. Tiene que usar el inoperador para esto, por lo que su consulta será como SELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9)para ese __inoperador de Django .

Nilesh
fuente
20
+1 para una pequeña explicación. Si bien sé que puedo leer los documentos, eso no significa necesariamente que haya entendido los documentos.
Austin A
6

De la documentación de Django :

Blog.objects.in_bulk([1])
{1: <Blog: Beatles Blog>}

Blog.objects.in_bulk([1, 2])
{1: <Blog: Beatles Blog>, 2: <Blog: Cheddar Talk>}

Blog.objects.in_bulk([])
{}

Blog.objects.in_bulk()
{1: <Blog: Beatles Blog>, 2: <Blog: Cheddar Talk>, 3: <Blog: Django Weblog>}

Blog.objects.in_bulk(['beatles_blog'], field_name='slug')
{'beatles_blog': <Blog: Beatles Blog>}
Omoidashita
fuente