我有一个列表,当在外部表的非主键“测试”中找到任何这些项目时,我想过滤我的查询集。所以我写了这样的东西:
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 正确发出查询?