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?



Jawaban:


538

Dari dokumentasi Django :

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

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 .


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>}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.