1

私は次の(簡略化された)モデルを持っています:

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にある質問/回答のほとんどは数年前のものなので、提案されたハックよりも慣用的で簡単な方法があるのではないかと思いました。

編集:私が明確にしたと思っただけです:上記のソリューションは機能し、私はそれらを使用しています(本番環境ではありませんが)。この問題のより良い解決策に興味があります。

4

1 に答える 1

0

生のSQLを使用することを考えましたか

Post.objects.raw("""
    SELECT DISTINCT post FROM
        (SELECT appname_post.post_id AS post, appname_recommendation.submit_time
        FROM appname_post
        INNER JOIN appname_recommendation 
        ON appname_post.post_id = appname_recommendation.post_id
        ORDER_BY appname_recommendation.submit_time)
    """)
于 2013-02-20T09:22:59.010 に答える