我有一個列表,我想過濾我的Queryset,當這些項目中的任何一個被發現在一個外部表的非主鍵「測試」。所以我寫這樣的東西:Django Queryset過濾器缺少行情
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正確地發出查詢?
試試'str(item)' – keyser
爲什麼不使用:'cls.objects.filter(next_task__test__in = test_list)'? –
放入'in'不會改變任何內容。把'exact'放在'OR's鏈中,但是缺少的引號仍然缺失。類型轉換沒有效果。 –