私は次の(簡略化された)モデルを持っています:
class Post(models.Model):
title=models.CharField(max_length=500)
class Recommendation(models.Model):
post=models.ForeignKey(Post)
submit_time=models.DateTimeField(auto_now_add=True)
そして、送信時間Posts
順に並べられた個別のリストを取得したいと思います。Recommendation's
私が試した最初の方法は、単純明快でした。
Post.objects.order_by('recommendation__submit_time').distinct()
しかし、驚くべきことに、これにより、重複したPostオブジェクトを持つQuerySetが得られました。Djangoは順序付けのために追加の列を追加しますが、結果にはそれらを返さないため、行は実際には異なります。
周りを見回すと、順序付けの代わりに集計を使用するなど、SOに関するいくつかの回答が見つかりました。
Post.objects.all().annotate(Max('recommendation__submit_time')).order_by('recommendation__submit_time__max')
または、モデルを非正規化し、にlast_recommended_time
フィールドを追加しますPost
。
すでにSOにある質問/回答のほとんどは数年前のものなので、提案されたハックよりも慣用的で簡単な方法があるのではないかと思いました。
編集:私が明確にしたと思っただけです:上記のソリューションは機能し、私はそれらを使用しています(本番環境ではありませんが)。この問題のより良い解決策に興味があります。