Como posso filtrar uma consulta Django com uma lista de valores?


290

Tenho certeza de que essa é uma operação trivial, mas não consigo descobrir como isso é feito.

Tem que haver algo mais inteligente do que isso:

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

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

Eu estou olhando para obtê-los todos em uma consulta com algo como:

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

Como posso filtrar uma consulta Django com uma lista de valores?



Respostas:



48

Quando você tem uma lista de itens e deseja verificar os possíveis valores da lista, não pode usá-lo =.

A consulta sql será semelhante à SELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9]que não é verdadeira. Você precisa usar o inoperador para isso, para que a consulta seja semelhante SELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9)ao __inoperador de fornecimento do Django .


20
+1 para uma pequena explicação. Embora eu saiba que posso ler os documentos, isso não significa necessariamente que os compreendi.
Austin A

6

Na documentação do 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>}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.