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?

ajwood
fonte

Respostas:

538

Na documentação do Django :

Blog.objects.filter(pk__in=[1, 4, 7])
charlax
fonte
isso gerará erro se passarmos pela lista vazia ou não retornarmos nenhum registro?
Rakmo 12/0418
@OmkarDeshpande Não
DylanYoung
@DylanYoung Então ele irá retornar nenhum registro
Rakmo
2
@OmkarDeshpande Exatamente. Embora, se você ligar get(), você obterá um erro ObjectDoesNotExist, é claro.
precisa saber é o seguinte
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 .

Nilesh
fonte
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>}
Omoidashita
fonte