¿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?



Respuestas:


538

De la documentación de Django :

Blog.objects.filter(pk__in=[1, 4, 7])

¿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 .


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>}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.