0

私はこのようなことをしているモデルを持っています:

class Job(Model):
    ...

class Attempt(Model):
    job = ForeignKey(Job)
    attempt_number = PositiveIntegerField()

class StatusHistory(Model):
    attempt = ForeignKey(Attempt)
    state = CharField()

ジョブがさまざまな状態を経るにつれて、状態が履歴に追加されます。いろいろな試行を重ねていくと、試行が追加されます。

現在の (つまり、最新の) 試行が特定の (現在の、最新の) 状態にあるすべてのジョブを反復処理するクエリを作成したいと思うことがよくあります。

job.attempt_set.latest() と言って特定のジョブの最新の試行を取得できることはわかっていますが、たとえば、

Job.objects.filter(attempt_set__latest__state_set__latest__state='final')

不可能に思えます。

最新の試行/状態の Job または Attempt に別の外部キーを追加し、試行/状態の履歴を追加するときにトランザクションで最新の状態に保つ傾向があります。

考え?これはよく知られたデザインパターンですか?あなたならどうしますか?

4

1 に答える 1

1

場合によっては、 を使用して古き良き SQL にフォールバックする必要がありますextra()。どのように解決しますか?

Job.objects.extra(
    select={'lastest_state': '''(select state from app_statushistory T1
    join app_attempt T2 on T1.attempt_id=T1.id
    where T2.job_id=app_job.id
    order by id desc limit 1)'''},
    where=['lastest_state=%s'],
    params=['final'])

app_<tablename>出現箇所を実際のテーブル名に置き換えます (およびorder by id、別の並べ替えがある場合は別の並べ替えに置き換えます)。

のドキュメントは次のとおりですextra()

于 2013-10-02T18:01:06.673 に答える