【发布时间】:2020-09-16 19:51:08
【问题描述】:
我有一个类似的模型:
class Tree(models.Model):
description = models.CharField(max_length = 255, null = False, blank = False)
parent = models.ForeignKey("Tree", null = True, blank = True, on_delete = models.CASCADE)
class Meta:
ordering = ['description', '-id']
我需要找到每个家长的最新记录。
我试过这个:
latests = Tree.objects.values("parent").annotate(last = Max("pk"))
结果不正确,因为 SQL 查询是:
SELECT parent_id, MAX(id) AS last FROM tree GROUP BY id;
ORM 将外键转换为源,并且不使用字段内的值。 有没有办法不“跟随”外键而使用字段的值?
在PostgreSQL数据库中生成的模型名为tree的三列表:
Column | Type
------------+-----------------------
id | integer
description | character varying(255)
parent_id | integer
有了这些数据:
id | description | parent_id
----+-------------+----------
1 | A | 1
2 | B | 2
3 | C | 1
4 | D | 1
5 | E | 2
我想要这个结果:
last | parent_id
-----+----------
5 | 2
4 | 1
我可以在 SQL 中简单地做到这一点:
select max(id) as last, parent_id from tree group by parent_id
【问题讨论】:
-
你能记录下你想要的查询在 SQL 中应该是什么样子吗?
-
通过 parent_id 从树组中选择 parent_id, max(id)。这个问题似乎与 MySQL 的code.djangoproject.com/ticket/24748 相同。我正在使用 postgresql
-
那是你根据你的问题得到的查询,而不是你想要的查询。请发布您想要的查询(即:JOIN 查询)。此外,您引用的错误已修复,并且未出现在您的示例中,因为它按 id 正确分组。
-
没有。这是我想要的“GROUP BY parent_id”查询。系统生成的查询具有“GROUP BY id”。为了更清楚,我还在问题中添加了表定义。
-
好的,请用这些详细信息更新您的问题。