DjangoORM/Postgres:按日期排序时,根据特定列的不同值获取最新行

DjangoORM/Postgres: Get latest row based on distinct values of certain column when ordered by date

我有一个名为 Comment 的 Django 模型(数据库是 Postgres),我用来自外部 API.

的响应填充它
class Poster(models.Model):
    username = models.TextField()

class Comment(models.Model):
    created_dt = models.DateTimeField()
    body = models.TextField()
    poster = models.ForeignKey('Poster', on_delete=models.PROTECT, related_name = 'comments'
    client_version = models.CharField(max_length=30)
    

API 响应中的每个评论对象都包含一个 client_version,这是发布者用来提交所述评论的 android 客户端的版本。

我想写一个查询,告诉我 client_version 每个发帖人提交了他们的 最近 评论,以确定应该指示哪些发帖人升级他们的客户端.

在此示例场景中,我们假设发帖人将其 android 客户端升级到新版本后,他们将无法返回到早期版本;因此 他们 最新评论中的 client_version 表示发布者当前使用的版本。

为单个海报执行此操作很容易:

def get_latest_version(poster):

    return Comment.objects.filter(
        poster__username=poster
        ).order_by('-created_dt'
        ).values('poster__username', 'client_version').first()


>>> get_latest_version('kevin')
{'poster__username': 'kevin', 'client_version': 'v4.20.0'}

显然 运行 对每个张贴者的这个代码是低效的。

如何使用 Django ORM 执行单个 postgres 查询,returns 类似于:

[{'poster__username': 'kevin', 'client_version': 'v4.20.0'},
 {'poster__username': 'perry', 'client_version': 'v4.21.0'},
 {'poster__username': 'paul', 'client_version': 'v4.20.0'},
]

我已经用this answer...

中的方法解决了这个问题
Comment.objects.all(
    ).order_by('poster__username', '-created_dt'
    ).distinct('poster__username'
    ).values('poster__username', 'client_version', 'created_dt')]

这也给了我最新评论的日期。