Skip to main content
 首页 » 编程设计

python之如何在 Django 管理的数据库中找到每个项目的最新行

2025年05月04日23jirigala

在数据结构中为每个相关对象查找最新条目的最佳方法是什么?我有一个像这样的 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) 不同的。这似乎不符合“id”排序,这是我尝试获取最新的:

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

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

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

请您参考如下方法:

如果您不关心顺序(按 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;