Bagaimana saya bisa memfilter permintaan Django dengan daftar nilai?

290

Saya yakin ini adalah operasi sepele, tetapi saya tidak tahu bagaimana melakukannya.

Pasti ada sesuatu yang lebih pintar dari ini:

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

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

Saya ingin mendapatkan semuanya dalam satu permintaan dengan sesuatu seperti:

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

Bagaimana saya bisa memfilter permintaan Django dengan daftar nilai?

ajwood
sumber

Jawaban:

538

Dari dokumentasi Django :

Blog.objects.filter(pk__in=[1, 4, 7])
pembohong
sumber
apakah ini akan menimbulkan kesalahan jika kita melewati daftar kosong atau tidak mengembalikan catatan?
Rakmo
@OmkarDeshpande No
DylanYoung
@DylanYoung Jadi tidak akan mengembalikan catatan
Rakmo
2
@OmkarDeshpande Tepat. Padahal, jika Anda menelepon get(), Anda tentu saja akan mendapatkan kesalahan ObjectDoesNotExist.
DylanYoung
48

Ketika Anda memiliki daftar item dan Anda ingin memeriksa nilai yang mungkin dari daftar maka Anda tidak dapat menggunakannya =.

Kueri sql akan seperti SELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9]yang tidak benar. Anda harus menggunakan inoperator untuk ini sehingga permintaan Anda akan seperti SELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9)untuk yang disediakan __inoperator Django .

Nilesh
sumber
20
+1 untuk penjelasan kecil. Walaupun saya tahu saya bisa membaca dokumen, itu tidak berarti saya mengerti dokumen.
Austin A
6

Dari dokumentasi 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
sumber