リストがあり、これらのアイテムのいずれかが外部テーブルの非主キー「テスト」で見つかったときに、クエリセットをフィルター処理したいと考えています。だから私はこのようなものを書きます:
test_list = ['test1', 'test2', 'test3', 'test4', 'test5']
return cls.objects.filter(reduce(lambda x, y: x | y, [models.Q(next_task__test = item) for item in test_list]))[:20]
これは空のリストを返します。生成された SQL クエリを見ると、次のようになります。
SELECT ...
FROM ...
WHERE "job"."next_task_id" IN (test1, test2, test3, test4, test5) LIMIT 20;
それがそうあるべきだったのに対し、これは次のとおりです。
SELECT ...
FROM ...
WHERE "job"."next_task_id" IN ('test1', 'test2', 'test3', 'test4', 'test5') LIMIT 20;
引用符がない場合、SQLite3 はそれらが列名であると認識し、何も返しません。手動で引用符を追加し、Django をまったく使用せずにテーブルで SQLite3 クエリを実行すると、目的の結果が得られます。Django にクエリを正しく発行させるにはどうすればよいですか?