10

私は次のような基本的なモデルを持っています:

class Stats(models.Model):

   created = models.DateTimeField(auto_now_add=True)
   growth = models.IntegerField()

セロリ ジョブを 10 分ごとに実行して、新しい統計オブジェクトを作成します。

.latest()on aを使用すると、QuerySetこれまでの最新の Stats オブジェクトが得られます。

ただし、毎日 1 つの Stats オブジェクトを含むリストが必要です。

次の点を考慮してください。

Stats(growth=100) #created 1/1/13 23:50
Stats(growth=200) #created 1/1/13 23:59
Stats(growth=111) #created 1/2/13 23:50
Stats(growth=222) #created 1/2/13 23:59

QuerySetは、毎日最新のものを返す必要があります。例では、200 と 222 の成長を持つものです。

SQL では、各日の最大値を使用してサブクエリを起動し、それを結合します。

生の SQL を使用したくないので、django ORM でこれを行う方法はありますか?

4

4 に答える 4

0

他の 2 つの回答に加えて、結果を別のモデルに保存することも検討してください (特に、入力後に 1 日あたりのデータがあまり変化せず、大量のデータがある場合)。何かのようなもの:

class DailyStat(models.Model):
    date = models.DateField(unique=True)
    # Denormalisation yo
    # Could also store foreign keys to Stats instances if needed
    max_growth = models.IntegerField()
    min_growth = models.IntegerField()
    # .
    # .
    # .
    # and any other stats per day e.g. average per day

定期的な Celery タスクを追加します。

from celery.task.schedules import crontab
from celery.task import periodic_task
import datetime

# Periodic task for 1am daily
@periodic_task(run_every=crontab(minute=0, hour=1))
def process_stats_ery_day():
    # Code to populate DailyStat
    today = datetime.date.today()
    # Assumes relevant custom Manager methods exist
    # Can use regular Django ORM methods to achieve this
    max = Stats.objects.get_max_growth(date=today)
    min = Stats.objects.get_min_growth(date=today)
    ds = DailyStat(date=today, max_growth=max.growth, min_growth=min.growth)
    ds.save()

次の方法で結果を取得します。

DailyStat.objects.all()

もちろん、考慮すべき他の要因の中でも、このアプローチでは、過去の統計が変更された場合などに DailyStat を更新する必要があるという問題が生じます (この方法を使用する場合は、シグナルを使用できます)。

于 2013-06-24T02:26:51.890 に答える
0

たぶん、次のようなことができます:

import datetime
day = datetime.datetime.now().day
the_last_one = Stats.objects.filter(created__day=day).order_by('-created')[0]

または何かのような

the_last_one = Stats.objects.filter(created__day=day).order_by('created').latest()
于 2013-06-20T16:56:40.920 に答える