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')]
这也给了我最新评论的日期。
我有一个名为 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')]
这也给了我最新评论的日期。