17

これに対する答えをあちこち探しましたが、何も見つかりませんでした。おそらく、これは単なるばかげた質問か、非常にトリッキーな質問です。ここにあります:

私のモデルがこれであるとしましょう(疑似djangoコード):

Event
  type = ForeignKey(EventType)
  name = CharField
  date_start = DateField
  date_end = DateField

EventType
  name = CharField

私が知りたいのは、イベントの種類ごとの平均継続時間です。私が今行っているのは、新しいイベントが作成されるたびに平均期間を計算し (save メソッド)、それを EventType の average_duration 列に格納することです。このアプローチの問題は、「 Y 年中のタイプ X のイベ​​ントの平均継続時間はどれくらいだったか」などの質問に答えられないことです。したがって、これらのような質問に答えるために列を追加する代わりに、「リアルタイム」で行うことをお勧めします。

クエリセットに注釈を付けることでこれを行うことができますか? まず、イベントの種類ごとに日付の違いを取得し、次にそれらの平均を計算し、その平均で Event クエリセットに注釈を付ける必要があると思います。

4

3 に答える 3

54

ただの更新。Django >= 1.8 では、次のことが可能です:

from django.db.models import F, ExpressionWrapper, fields

duration = ExpressionWrapper(F('date_end') - F('date_start'), output_field=fields.DurationField())

events_with_duration = Event.objects.annotate(duration=duration)

その後、次のようなクエリを実行できます。

events_with_duration.filter(duration__gt=timedelta(days=10))
于 2015-09-30T01:08:27.280 に答える
1

各行に日付の差を追加するには、追加のメソッドを使用してクエリセットを作成する必要があります

次に、集計メソッドを使用して、追加したばかりの列の平均を計算します。

ただし、この方法は遅く、スケーリングされないことに注意してください。計算された値を event_type に保存するのが最善の選択肢です。

于 2010-06-28T09:47:25.067 に答える
0

あなたの最善の策は、date_end - date_start列を使用して SQL ビューを作成し、このビューで django モデルを作成することだと思います。そうすれば、ビューをクエリして、必要に応じて注釈を付けることができます。私はあなたのモデルに似たモデルでこれを行いました。必要に応じて、興味深いコードを抽出できるかもしれません。

于 2010-06-28T09:44:58.890 に答える