Django で OR を使ったクエリを実行する方法

データベースから「A OR B」っていう条件で絞り込んでデータを取得するのって、Django ではどうやるんだろう。「A AND B」なら filter や exclude でいいんだけど…。

困ったときは Django の公式ドキュメントを見るべし!ってことで調べてみたら、ちゃんと書いてありました。

Q オブジェクトを使えばいいのね。

例えば「user1 または user2 の投稿を取得する」だと、Q オブジェクトを使って

posts = Post.object.filter(Q(author=user1) | Q(author=user2))

と書けます。

OR と AND を組み合わせた、「user1 または user2 の投稿で下書きじゃないものを取得する」の場合

posts = Post.object.filter(Q(author=user1) | Q(author=user2),
                           Q(is_draft=False))

で OK。

filter や exclude といった QuerySet のメソッドと、Q オブジェクトを使えば、たいてい事足りそうです。ホント、Django の Model API って強力だ。