我有四个Django模型:User,Project,Task,TaskResult。现在,给定一个用户,我想计算用户提交给每个项目的结果,并返回用户提交的项目的任务(任何一个)少于X个结果。 由于TaskResults的数量非常大,我无法在内存中执行此操作 - 它应该都是SQL。 (这是我的第一个问题,如果有任何问题,请耐心等待,我一直在寻找一整天的解决方案,而且找不到一个 - 很可能是因为我觉得很困难要问正确的问题。)使用Django ORM在1:n:m数据库关系中查找多个X元素
我试过聚合,注释,F的,Q和什么的,但它没有解决。现在,我写了一个原始查询(我很确定)可以完成这项工作:
SELECT crowd_task.id
FROM crowd_project
LEFT JOIN crowd_task ON crowd_task.project_id=crowd_task.id
LEFT JOIN crowd_taskResult ON crowd_taskResult.task_id=crowd_task.id
WHERE crowd_taskResult.user_id=23
GROUP BY crowd_project.id
HAVING COUNT(crowd_taskResult.task_id) < 3
LIMIT 0,1
此SQL查询已经过测试并且可以正常工作。
下面是一个例子: 有一个用户(id = 23)和两个项目P1和P2。 P1有四项任务:T11,T12,T13和T14。 P2有两个任务:T12,T22。 现在用户开始提交结果。由于用户应该提交的最大结果数量为3(参见上面的SQL),所以在开始时查询应该总是返回P1的任何任务。假设用户现在已经将结果提交给T11,T12和T14,她应该而不是解决了T13。相反,查询应返回P2的任何任务。 (顺便说一句:也有检查是否所有的任务已经解决了这个用户 - 我忽略了这一点为了简单起见。)
看起来很简单,不是吗?我会尽可能地使用ORM,但我不知道如何完成这个任务。
提供数据和期望结果的样本。这也是一种很好的方式,可以帮助您理解您在数据操作方面所做的努力。 –
感谢您的提示!示例现在在文本中。我现在正在使用RawQuerySets,但这可能不适用于除MySQL之外的其他数据库... – decay0815
您的查询不使用任何东西,98%的数据库引擎不支持。 –