当前位置: 首页 > 面试题库 >

通过具有最大列值的记录过滤Django查询

鲜于渊
2023-03-14
问题内容

有没有一种简单的方法可以根据列中具有最大值/最小值的记录来过滤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):

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


 类似资料:
  • 问题内容: 我有下表: 如何在每个“班级”中找到最大“分数”的“名称”? 要求的输出: 这是针对MySQL的。 问题答案:

  • 问题内容: 我正在尝试使用过滤查询集 我的问题是我不知道用户想提前搜索哪个字段,因此我需要用一个变量替换“名称”,如下所示 我怎么做? 问题答案: 差不多了.. 要了解它在做什么,请在Google周围搜索 :)了解Python中的kwargs 将字典键/值对扩展为关键字参数-值对。 使你的示例适应解决方案:

  • 问题内容: 我正在尝试获取最新的Django模型对象,但似乎无法成功。 这些都不起作用: 问题答案:

  • 问题内容: 我敢肯定这是一个微不足道的操作,但是我不知道它是如何完成的。 肯定有比这更聪明的东西: 我正在寻找将它们全部添加到一个查询中,例如: 如何使用值列表过滤Django查询? 问题答案: 从Django文档中:

  • 问题内容: 我有一个模特 我试图这样做来计算此查询集中的总和: 此查询有什么问题?还是有其他方法可以计算列总和? 我知道这可以通过在queryset上使用for循环来完成,但是我需要一个优雅的解决方案。 问题答案: 你可能正在寻找

  • 问题内容: 我开始使用django-tables2(从第一印象中就可以强烈推荐),我问自己如何实现列过滤。我找不到合适的文档,但是我确定它在那里。 问题答案: 答案有点晚了,但是无论如何…我也找不到任何合适的文档来进行列过滤。有很多方法可以做到这一点: 答:手动:我添加了一个包含要过滤的字段的表单,然后在我的视图中执行以下操作: 这很好用,但是不是那么干,因为它在视图中是硬编码的。 B.使用Sin

  • 问题内容: 我有下表 我想实现只选择具有日期最大值的ID的结果。IE id,value,adate 我该如何使用呢?我做了如下,但它不起作用。 有人可以协助查询吗? 问题答案: 如果您使用的是具有分析功能的DBMS,则可以使用ROW_NUMBER: 否则,您将需要使用按ID联接到聚合的最大日期,以将结果从中筛选出来,仅过滤到那些日期与该ID的最大日期相匹配的对象

  • 问题内容: 我正在使用日志记录()记录消息。 在1个单一模块中,我正在调试级别记录消息; 其中一些调试消息来自于其他消息; 我希望能够基于它们是来自a还是来自b来启用/禁用日志记录; 我猜想我必须使用日志记录的过滤机制。 有人可以告诉我下面的代码如何被执行我想要的工作吗? 如果将这个简单的示例扩展到更多模块和每个模块更多的功能,我会担心很多记录器; 是否可以将每个模块的记录器数量限制为1个?请注意