2014-01-25 27 views
0

我有四个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,但我不知道如何完成这个任务。

+0

提供数据和期望结果的样本。这也是一种很好的方式,可以帮助您理解您在数据操作方面所做的努力。 –

+0

感谢您的提示!示例现在在文本中。我现在正在使用RawQuerySets,但这可能不适用于除MySQL之外的其他数据库... – decay0815

+0

您的查询不使用任何东西,98%的数据库引擎不支持。 –

回答

0

Django的ORM不支持HAVING。由于HAVING是正确的方法,因此您必须使用原始查询。

+0

感谢您的快速回复!据我所知,从[tis question](http://stackoverflow.com/questions/13344182/how-to-implement-the-having-clause-in-sqlite-django-orm)HAVING可以通过聚合实现Django的。根据[Django](https://code.djangoproject.com/ticket/8784)上的票据,现在还在讨论是否应该将HAVING添加到extra()中。无论如何,我现在会解决raw()。非常感谢您的帮助! – decay0815