gpt4 book ai didi

python - 按具有最大列值的记录过滤 Django 查询

转载 作者:太空狗 更新时间:2023-10-29 21:06:11 29 4
gpt4 key购买 nike

有没有一种简单的方法可以根据哪条记录在列中具有最大/最小值来过滤 Django 查询?我本质上是在询问 these questions ,但在 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 以外的值):

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
''')

关于python - 按具有最大列值的记录过滤 Django 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7020313/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com