在数据结构中为每个相关对象查找最新条目的最佳方法是什么?我有一个像这样的 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;
