Come posso filtrare una query Django con un elenco di valori?


290

Sono sicuro che si tratta di un'operazione banale, ma non riesco a capire come sia fatta.

Deve esserci qualcosa di più intelligente di questo:

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

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

Sto cercando di ottenerli tutti in una query con qualcosa del tipo:

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

Come posso filtrare una query Django con un elenco di valori?



Risposte:


538

Dalla documentazione di Django :

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

genererà un errore se passiamo un elenco vuoto o non restituiamo alcun record?
Rakmo,

@OmkarDeshpande No
DylanYoung

@DylanYoung Quindi non restituirà alcun record
Rakmo

2
@OmkarDeshpande Esattamente. Tuttavia, se chiami get(), otterrai ovviamente un errore ObjectDoesNotExist.
DylanYoung,

48

Quando si dispone di un elenco di elementi e si desidera controllare i possibili valori dall'elenco, non è possibile utilizzarli =.

La query sql sarà come SELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9]non vera. Devi usare l' inoperatore per questo, quindi la tua query sarà simile SELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9)a quella __indell'operatore di fornitura di Django .


20
+1 per una piccola spiegazione. Anche se so di poter leggere i documenti, ciò non significa necessariamente che ho capito i documenti.
Austin, un

6

Dalla documentazione di 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>}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.