最新のスプリント時間順に並べたランナーのリストを表示したいとします。
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
Django QuerySetのドキュメントには次のように記載されています。
結果を並べ替えるには、多値フィールドを指定することができます (たとえば、ManyToManyField フィールド)。通常、これは賢明なことではなく、実際には高度な使用機能です。ただし、クエリセットのフィルタリングまたは利用可能なデータが、選択している主要な項目ごとに 1 つの順序付けデータしかないことを意味することがわかっている場合、順序付けはまさにあなたがやりたいことである可能性があります。複数値フィールドの順序付けは注意して使用し、結果が期待どおりであることを確認してください。
ここで何らかのフィルターを適用する必要があると思いますが、Django が正確に何を期待しているのかわかりません...
この例では明らかではないため、1 つ注意してください。ランナー テーブルには数百のエントリがあり、スプリントにも数百のエントリがあり、後でおそらく数千のエントリがあります。データはページ分割されたビューで表示されるため、Python での並べ替えはオプションではありません。
私が目にする唯一の他の可能性は、自分で SQL を書くことですが、これはどうしても避けたいと思います。