【问题标题】:Django - MAX ... GROUP BY on ForeignKey to itselfDjango - MAX ... GROUP BY 对自己的 ForeignKey
【发布时间】: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”。为了更清楚,我还在问题中添加了表定义。
  • 好的,请用这些详细信息更新您的问题。

标签: django group-by annotate


【解决方案1】:

最后我找到了一个可能的解决方法:我删除了 Meta 类中的排序,结果是预期的。

【讨论】:

    猜你喜欢
    • 2021-08-01
    • 1970-01-01
    • 2015-12-10
    • 2018-07-14
    • 2010-11-20
    • 2012-10-30
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多