私はこのようなことをしているモデルを持っています:
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 に別の外部キーを追加し、試行/状態の履歴を追加するときにトランザクションで最新の状態に保つ傾向があります。
考え?これはよく知られたデザインパターンですか?あなたならどうしますか?