我有以下(简化)模型:
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中的大多数问题/答案都已经存在了几年,所以我想知道是否有比这些建议的黑客更为惯用和直接的方法。
编辑: 我以为我说清楚了: 上面列出的解决方案确实有效,我正在使用它们(虽然不是在生产中)。我只是对这个问题的更好解决方案感兴趣。
答案 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)
""")