如何将以下派生表查询转换为django ORM?

时间:2016-08-24 12:16:39

标签: django django-orm

 SELECT count(user_min.user_id_id), date(user_min.date_time) from 
   ((SELECT MIN(date(date_time)) as date_time,user_id_id FROM `pied_visit` WHERE branch_id_id IN (5,6,9) GROUP BY user_id_id) user_min) 
   GROUP BY date(user_min.date_time)

在很多地方搜索过。但找不到任何有用的东西。

1 个答案:

答案 0 :(得分:0)

这是一种奇怪的SQL查询。我不确定是否有可能在一个声明中做到这一点。

让我们从这个子查询开始: SELECT MIN(date(date_time)) as date_time,user_id_id FROM "pied_visit" WHERE branch_id_id IN (5,6,9) GROUP BY user_id_id) user_min

据我所知,没有办法在Django中提供表别名,所以如果别名对于它在外部查询中起作用很重要,并且PiedVisit是Django的模型名称SQL表pied_visit,我们可以这样得到它:

p = PiedVisit.objects.values('user_id_id').annotate(new_date_time=Min(TruncDate(date_time)).filter(branch_id_id__in=[5,6,9])

以上示例仅适用于Django 1.10及更高版本,因为TruncDate在较低版本中不可用。您必须使用.extra() queryset API并为旧版本插入原始SQL。

无论早期声明的结果如何,您只需使用列表推导和集合在Python中进行处理。

from collections import Counter
c = Counter([row['new_date_time'] for row in p])
dict(c)

您最终会得到一个dict,其键是日期,相应的值将是计数。

TruncDateextra()上的文档。