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

有时,您只需要使用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 回答