Django - 通过向后相关模型的字段对QuerySet进行排序

时间:2013-02-20 09:00:31

标签: python django django-models django-queryset

我有以下(简化)模型:

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

但令人惊讶的是,这为QuerySet提供了重复的Post对象。 Turns out the rows are actually different because Django adds extra columns for the ordering, but does not return them in the results

环顾四周,我在SO上找到了几个答案,包括使用聚合而不是订购:

Post.objects.all().annotate(Max('recommendation__submit_time')).order_by('recommendation__submit_time__max')

或者取消规范化模型并将last_recommended_time字段添加到Post

SO中的大多数问题/答案都已经存在了几年,所以我想知道是否有比这些建议的黑客更为惯用和直接的方法。

编辑: 我以为我说清楚了: 上面列出的解决方案确实有效,我正在使用它们(虽然不是在生产中)。我只是对这个问题的更好解决方案感兴趣。

1 个答案:

答案 0 :(得分:0)

您是否考虑过使用raw 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)
    """)