假设我想显示一个按他们最近的冲刺时间排序的跑步者列表。
class Runner(models.Model):
name = models.CharField(max_length=255)
class Sprint(models.Model):
runner = models.ForeignKey(Runner)
time = models.PositiveIntegerField()
created = models.DateTimeField(auto_now_add=True)
这是我将在 SQL 中执行的操作的简要概述:
SELECT runner.id, runner.name, sprint.time
FROM runner
LEFT JOIN sprint ON (sprint.runner_id = runner.id)
WHERE
sprint.id = (
SELECT sprint_inner.id
FROM sprint as sprint_inner
WHERE sprint_inner.runner_id = runner.id
ORDER BY sprint_inner.created DESC
LIMIT 1
)
OR sprint.id = NULL
ORDER BY sprint.time ASC
允许指定一个多值字段来对结果进行排序(例如,ManyToManyField 字段)。通常这不是一件明智的事情,它确实是一个高级使用功能。但是,如果您知道查询集的过滤或可用数据意味着您选择的每个主要项目只有一个排序数据,那么排序可能正是您想要做的。小心使用多值字段的排序,并确保结果符合您的预期。
我想我需要在这里应用一些过滤器,但我不确定 Django 到底期望什么......
请注意,因为在此示例中并不明显:Runner 表将有数百个条目,sprint 也将有数百个,并且在以后的某些日子里可能有数千个条目。数据将显示在分页视图中,因此不能在 Python 中进行排序。
我看到的唯一另一种可能性是自己编写 SQL,但我想不惜一切代价避免这种情况。