有没有一种简单的方法可以根据列中具有最大值/最小值的记录来过滤Django查询?我本质上是在问这些问题,但是是在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特定功能的想法或解决方案都将有所帮助。
您可能只想在这里使用原始SQL,raw()manager方法可简化此操作,使您可以从查询中返回模型实例。唯一的技巧是原始查询需要包含主键。这可能应该对您有用(除非您将主键设置为以外的其他值id):
raw()
id
latest_phone_numbers = Person.objects.raw(''' SELECT p1.id, 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 ''')