【发布时间】:2011-10-24 14:53:24
【问题描述】:
有没有一种简单的方法可以根据哪条记录在列中具有最大值/最小值来过滤 Django 查询?我本质上是在问thesequestions,但在 Django 的 ORM 的特定上下文中。
例如
假设我有一个模型旨在存储每个人电话号码的历史值。
class Person(models.Model):
name = models.CharField(max_length=100)
phone = models.CharField(max_length=100)
created = models.DateTimeField(auto_now_add=True)
有记录:
Person(name='Jim',phone='123-456-9870', created=datetime(2005,1,2,4,2))
Person(name='Jim',phone='329-802-9870', created=datetime(2006,9,2,7,8))
Person(name='Sue',phone='324-345-3450', created=datetime(2008,7,4,6,1))
现在假设我想找到每个人最近的电话号码。
在 SQL 中,我通常必须使用子查询来计算最大值:
SELECT p1.name, p1.phone, p1.created
FROM person_person p1, (
SELECT name, MAX(created) AS max_created
FROM person_person
GROUP BY name
) AS p2
WHERE p1.name = p2.name AND p1.created = p2.max_created
Django 中是否有任何机制可以简化这一点?
我在后端使用 PostgreSQL,因此任何依赖 PostgreSQL 特定功能的想法或解决方案都会有所帮助。
【问题讨论】:
-
似乎在 django 上你不能做你正在寻找的东西,除非你使用原始查询 sql。检查this。由于此时您将创建的 order_by('created') 添加到查询中的 select 中,因此 distinct 不会执行任何操作。
-
你可以用 Django ORM 做到这一点,看我的回复:stackoverflow.com/a/65898703/842572
标签: python sql django postgresql django-orm