Django:如何构建包含相关最新的查询?

时间:2013-10-02 16:42:29

标签: sql django django-models django-queryset

我有一个做这样的事情的模型:

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')

似乎没有可能。

我倾向于为作业添加另一个外键或尝试最新的尝试/状态,并在添加尝试/状态历史记录时在事务中保持最新。

思考?这是一个众所周知的设计模式吗?你会做什么?

1 个答案:

答案 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替换)。

Hereextra()的文档。