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.