Cer*_*rin 8 python sql django postgresql django-orm
有没有一种简单的方法来根据哪个记录在列中具有最大/最小值来过滤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)
Run Code Online (Sandbox Code Playgroud)
记录:
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))
Run Code Online (Sandbox Code Playgroud)
现在说我想找到每个人最近的电话号码.
在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
Run Code Online (Sandbox Code Playgroud)
Django中是否有任何可以简化此操作的机制?
我在我的后端使用PostgreSQL,因此任何依赖PostgreSQL特定功能的想法或解决方案都会有所帮助.
您可能只想在此处使用原始 SQL,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
''')
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3979 次 |
最近记录: |