2017-01-25 7 views
1

リンクされている2つのモデルがあります。ここでは単純化のためのサブセットです:django週平均平均クエリーセットを取得するにはどうすればいいですか

class Job(models.Model): 
    event = models.OneToOneField(Event, on_delete=models.CASCADE, null=False, blank=False) 
    completion_time = models.DateTimeField(db_index=True, null=True, blank=True) 
    labor_price = models.FloatField(verbose_name='Final Labor Price', blank=True, null=True) 

と:

class Event(models.Model): 
    start_time = models.DateTimeField(db_index=True, null=True, blank=True) 
    end_time = models.DateTimeField(db_index=True, null=True, blank=True) 

私はいくつかのことを取得する必要がある、と私は、彼らがSQLで行うことができます知っているが、私は何するかどうかはわかりません彼らはdjangoで。ジョブのlabor_priceには毎月と毎週の平均が必要です。私はそれをテストしていないように、他の言葉では、このようなものは、と私は、私がやっている何のためそれが間違っていてもよい:

SELECT `schedule_event.start_time`, AVG(`jobs_job.labor_price`) 
FROM jobs_job 
INNER JOIN schedule_event on jobs_job.event_id = schedule_event.id 
GROUP BY YEAR(`schedule_event.start_time`), MONTH(`schedule_event.start_time`) 
HAVING COUNT(`schedule_event.start_time`) = DAY(LAST_DAY(`schedule_event.start_time`)); 
私も週に平均時給労働の価格を取得する必要があり

、現時点でどのように動作するのかは分かりません。これは、日付の特定のフィルタでaverage(labor_price/(completion_time - event__start_time))のような何かを行うクエリになります。

+2

Iを生のクエリとしてそれを行います。たとえそれがdjango ORMコードで可能な場合でも、単純なSQLより読みにくくなります。 ORMクエリは最適ではありません。 – Raz

+0

私はそのクエリを動作させる必要があります。これは私がmysqlで使用していたものですが、タイムゾーンを認識できるタイムスタンプがあるため、pgsqlでは機能しないようですが、修正方法がわかりません。 –

答えて

1

私はこれをテストした、または週の平均時給労働価格で仕事をする時間があったが、私は信じていないあなたに、労働の価格のため、毎週、毎月の平均値を与える必要があり、次の

from datetime import datetime 
from django.db.models import Avg 

now = datetime.now() 

weekly_avg = Job.objects.filter(event__end_time__lte=now, event__start_time__gt=now-datetime.timedelta(days=7)).values('labor_price').aggregate(Avg('labor_price')) 
monthly_avg = Job.objects.filter(event__end_time__lte=now, event__start_time__gt=now-datetime.timedelta(days=30)).values('labor_price').aggregate(Avg('labor_price')) 
+0

私は非常に似たようなものを手に入れました。 'コンテキスト[ 'previous_week_average'] = Job.objects.filter(event__start_time__gt = timezone.now() - はtimedelta(日= 7)、event__start_time__lt = timezone.now()、labor_price__isnull =偽).aggregate(average_price =平均(」 labor_price '))[' average_price '] ' –

関連する問題