2

.annotate()Django ビューでの複雑な呼び出しから必要なすべての情報を取得できないという問題があります。これが私のモデルです:

RECORD_STATUS = (
    (0, "Hidden"),
    (1, "Unhidden"),
    (2, "Deleted"),
)
class Activity(models.Model):
    event_date = models.DateTimeField()
    duration = models.IntegerField(default=0)
    username = models.CharField(max_length=200)
    record_id = models.CharField(max_length=100)
    record_status = models.IntegerField(choices=RECORD_STATUS)
    record_quality = models.FloatField(default=0)

個別の record_id に基づいて次の値をビュー テンプレートに渡したいと思います。

  • 平均的な品質
  • カウント
  • 最新のイベント日付
  • 合計期間

と...

...latest status (特定の record_id の最新の event_date を持つ Activity のステータス)

次のクエリセット コードチャンクを使用して、これらのほとんどを意図したとおりに取得できましたが、特定の .xml の最新のステータスを取得できませんrecord_id。私は.extra()呼び出しが進むべき道かもしれないと信じる傾向がありますが、それを適切に構築することはできないようです.

record_id_details = Activity.objects.values(
    'record_id',
    ).annotate(
    ave_quality=Avg('record_quality'),
    count=Count('id'),
    latest_event_date=Max('event_date'),
    total_duration=Sum('duration'),
    # Here's where I'm going wrong
    # I need the record_statuses from the most recent Activities of each record_id
    latest_status=,# dont know... record_status WHERE Max(event_date) ???
).order_by(sort)

私が必要とするものを私に与える注釈引数に関するアドバイス、またはおそらく追加のコマンドを構築するための助けをいただければ幸いです。ありがとう!

4

2 に答える 2

1

このクエリを Django クエリセットで表現する組み込みの方法はありません。2 つのクエリで実行するのが、ORM だけで実行する最も簡単な方法です。生の SQL を気にせず、それをサポートするデータベース (PostgreSQL など) を使用している場合、必要なツールはウィンドウ関数と呼ばれます。詳細については、http://www.postgresguideを参照してください。 .com/tips/window.html

于 2013-03-29T07:09:01.470 に答える
0

2 番目のクエリを実行するだけで、すべてを分離しておくことができます。何かのようなもの:

latest = Activity.objects.filter(record_id="whatever_the_record_id_you_want").order_by("-event_date)
most_recent = latest[0]
what_you_asked_for = most_recent.record_status
于 2013-03-29T06:56:21.643 に答える