web-dev-qa-db-ja.com

値のリストを使ってDjangoクエリをフィルタするにはどうすればいいですか?

これは簡単な操作だと確信していますが、それがどのように行われているのか把握できません。

これより賢いものがあるはずです。

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

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

私はそれらのすべてを1つのクエリで次のようにして取得しようとしています。

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

値のリストを使ってDjangoクエリをフィルタするにはどうすればいいですか?

229
ajwood

Djangoのドキュメント から:

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

あなたがアイテムのリストを持っていて、あなたがリストから可能な値をチェックしたいときは、あなたは=を使うことができません。

SQLクエリはSELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9]のようになりますが、これは正しくありません。 Djangoが__in演算子を提供しているため、in演算子を使用する必要がありますので、クエリはSELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9)のようになります。

42
Nilesh

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>}
4
Omoidashita