2017-09-10 6 views
3

で私はこのようなDjangoのモデルがあります。私はリストにユーザー名を持っており、平均計算に使用する月と年ごとにグループ化したいと考えています。私のクエリは次のようなものです:Djangoのクエリグループは、月と年

私がこのクエリを実行したとき、私が望むと思った結果が得られました。それは私が得たもののサンプルです:

trx2 = EVENT.objects.filter(user__in=ru, pay_time__year=2016, pay_time__month=4) 

そして、私は結果60990件のレコードを得た:

<QuerySet [{'y': 2016, 'c': 61098, 'm': 4}, {'y': 2016, 'c': 104632, 'm': 5}]> 

が、私はこのクエリを実行しましたので、確認したかったです。
これは、最初のクエリから得た結果が正しくないことを意味します。私はループで2番目のクエリを使用して私が望むものを得ることができますが、これはGROUP BYを使用して1つのクエリを実行するのに比べて非常に遅くなることがわかります。

おかげで、

編集:ここでは
print trx.queryの出力です:

SELECT 
    EXTRACT(YEAR from `events_event`.`pay_time`) AS `y`, 
    EXTRACT(MONTH from `events_event`.`pay_time`) AS `m`, 
    COUNT(`events_event`.`id`) AS `c` 
FROM `events_event` 
WHERE 
`events_event`.`user` IN ('user1', 'user2') 
GROUP BY 
    EXTRACT(YEAR from `events_event`.`pay_time`), 
    EXTRACT(MONTH from `events_event`.`pay_time`) 
ORDER BY NULL 

そして、これはprint trx2.queryの出力です:

SELECT 
    `events_event`.`id`, 
    `events_event`.`user`, 
    `events_event`.`pay_time`, 
FROM `events_event` 
WHERE 
    (`events_event`.`user` IN ('user1', 'user2') 
AND `events_event`.`pay_time` BETWEEN 2015-12-31 22:00:00 AND 2016-12-31 21:59:59.999999 
AND EXTRACT(MONTH FROM CONVERT_TZ(`events_event`.`pay_time`, 'UTC', Africa/Cairo)) = 4) 
+0

を試すことができますが、あなたのモデルが –

+0

あなたの最初のクエリに空の 'order_by'を追加してみてくださいordering''ていない最後に ')(' .order_byを追加しようとしたと同じ結果を得ました。 @BearBrown – Ahmedn1

+0

あなたの質問に 'print trx.query'と' print trx2.query'の結果を追加できますか? –

答えて

2

私は、ここに解決策を考えますthe CONVERT_TZ

EXTRACT(MONTH FROM CONVERT_TZ(`events_event`.`pay_time`, 'UTC', Africa/Cairo)) 

あなたは

class Month(Func): 
    function = 'EXTRACT' 
    template = "%(function)s(MONTH from CONVERT_TZ(%(expressions)s, 'UTC', 'Africa/Cairo'))" 
    output_field = models.IntegerField() 
+0

これは大きな問題を解決しました。私はその質問を見るとは思わなかった。 – Ahmedn1

+0

あなたを助けてくれてうれしいですが、変数としてタイムゾーンを使うのが良いと思います。 –

+0

はい私もそうだと思います – Ahmedn1