2016-08-24 2 views
1
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) 

多くの場所で検索されました。しかし、役に立つものは何も見つかりませんでした。次の派生テーブルクエリをdjango ORMに変換するにはどうすればよいですか?

+0

生のSQLクエリをORMに変換する代わりに使用することを検討してみませんか? https://docs.djangoproject.com/en/1.10/topics/db/sql/# –

+0

私はそれを使うことができます。しかし、このクエリをORMに変換する方法を学びたいと思います。 –

+0

非常に簡単です。シンタックスとその結果を操作する方法については、ドキュメントに従ってください。 –

答えて

0

これは、奇妙なSQLクエリのようなものです。 1つのステートメントでそれを実行することさえ可能かどうかはわかりません。

は、私たちは、このサブクエリを見てみましょう: 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

私の知る限りでは、それは外側のクエリで機能するためにエイリアスが唯一重要ですので、もし、ジャンゴで表の別名を提供する方法はありません、そしてPiedVisitは、SQLテーブルpied_visitのためのDjangoのモデル名であるならば、我々はそうのようにそれを得ることができます:TruncDateは下のバージョンでは使用できないので

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

上記の例をのみ、上記ジャンゴ1.10で動作します。 .extra()クエリーセットAPIを使用し、古いバージョンのSQLを挿入する必要があります。

前のステートメントの結果が何であっても、リストの補完とコレクションを使用してPythonで処理するだけです。

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

あなたは、キー日付があるdictで終わるだろう、とそれぞれの値は、カウントされます。

TruncDateおよびextra()に関するドキュメント。

関連する問題