【问题标题】:In Django ORM, get records whose field value is maximal in a queryset在Django ORM中,获取查询集中字段值最大的记录
【发布时间】:2017-04-02 11:10:44
【问题描述】:

考虑一个简单的模型:

class Person(models.Model):
    name = models.CharField(max_length=256)
    age = models.IntegerField()

我想要一个表达式,它返回表中年龄最大的所有Person 对象的QuerySet。 IE。假设有 20 个 Person 记录,最大年龄是 70 但有 3 个不同的记录具有该值。我希望我的查询集恰好包含这 3 个 Person 对象。

我想我可以做到:

Person.objects.filter(age=Person.objects.aggregate(models.Max('age'))['age__max'])

但是哇,这看起来真是一团糟。它两次命中数据库。呸。

更好的选择?

【问题讨论】:

    标签: django django-queryset django-orm


    【解决方案1】:

    我无法直接回答您的问题,但我觉得您不应该因为在一次查询中得到这个问题而感到沮丧,让您的代码清晰也很重要。那你为什么不这样做:

    from django.db.models import Max
    # assumes that you have at least one record
    max_age = Person.objects.aggregate(Max('age'))['age__max']
    oldest_folks = Person.objects.filter(age=max_age)
    

    Max 会在 sql 语句中执行 MAXfilter 会执行简单的 sql 查找,没有一个操作非常昂贵。

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 2018-06-21
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多