我有一个做这样的事情的模型:
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')
似乎没有可能。
我倾向于为作业添加另一个外键或尝试最新的尝试/状态,并在添加尝试/状态历史记录时在事务中保持最新。
思考?这是一个众所周知的设计模式吗?你会做什么?
答案 0 :(得分:1)
有时候,你只需要使用extra()
回退到好的SQL。你会如何解决它?
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
替换)。
Here是extra()
的文档。