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)

我想获得PostsRecommendation'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 回答