如何在Django管理的数据库中查找每个项的最新行?

2024-10-05 10:56:50 发布

您现在位置:Python中文网/ 问答频道 /正文

在数据结构中查找每个相关对象的最新条目的最佳方法是什么?我有一个Django模型,比如:

class OtherThing(models.Model):
    pass

class Thing(models.Model):
    buddy =  models.ForeignKey(OtherThing, related_name=things)
    somedata = models.IntegerField()

我想为每个OtherThing获取最新的Thing。下面是一些缓慢而愚蠢的代码,可以得到我想要的结果:

latest_things = []
for other in OtherThing.models.iterator():
     latest_things.append(other.things.latest())

然而,这一切都是在Python空间中完成的,并向数据库发出许多查询。我还尝试使用(PostGreSQL only)DISTINCT ON。这似乎不符合“id”排序,这是我尝试获取最新的:

Thing.objects.order_by('buddy_id', '-id').distinct('buddy_id')

最初错误地输入为...distinct('id'),感谢okm指出这一点。

如何为每个OtherThing找到最新的Thing,最好是让数据库完成大部分工作?


Tags: 对象目的id数据库数据结构modelmodelslatest
1条回答
网友
1楼 · 发布于 2024-10-05 10:56:50

如果您不关心排序(按OtherThing DESC而不是按Thing DESC),则以下代码可以正常工作:

Thing.objects.order_by('-buddy', '-id').distinct('buddy')

如果这样做,可能需要使用IN查询或子查询或自连接编写.row(),例如:

SELECT * FROM thing_tbl WHERE id IN (SELECT DISTINCT ON (buddy_id) id FROM thing_tbl ORDER BY buddy_id DESC, id DESC) ORDER BY id DESC;

相关问题 更多 >

    热门问题