如何在 Django 中执行 SELECT MAX?

我有一个对象列表如何运行查询来给出字段的最大值:

我用的是这个代码:

def get_best_argument(self):
try:
arg = self.argument_set.order_by('-rating')[0].details
except IndexError:
return 'no posts'
return arg

评级是一个整数

173756 次浏览

请参阅 这个。您的代码如下所示:

from django.db.models import Max
# Generates a "SELECT MAX..." query
Argument.objects.aggregate(Max('rating')) # {'rating__max': 5}

您还可以在现有的查询集上使用它:

from django.db.models import Max
args = Argument.objects.filter(name='foo') # or whatever arbitrary queryset
args.aggregate(Max('rating')) # {'rating__max': 5}

如果您需要包含这个 max 值的模型实例,那么您发布的代码可能是最好的方法:

arg = args.order_by('-rating')[0]

注意,如果查询集为空,即没有参数与查询匹配(因为 [0]部分将引发 IndexError) ,那么这将出错。如果您希望避免这种行为,而只是在这种情况下返回 None,请使用 .first():

arg = args.order_by('-rating').first() # may return None

我已经为我的项目测试过了,它在 O (n)时间内找到了 max/min:

from django.db.models import Max


# Find the maximum value of the rating and then get the record with that rating.
# Notice the double underscores in rating__max
max_rating = App.objects.aggregate(Max('rating'))['rating__max']
return App.objects.get(rating=max_rating)

这样可以保证有效地获得最大的元素之一,而不是对整个表排序并获得顶部(大约 O (n * logn))。

Django 还有一个“ Best (field _ name = Nothing)”函数,用于查找最新的(max。价值)。它不仅适用于日期字段,还适用于字符串和整数。

可以在调用该函数时给出字段名:

max_rated_entry = YourModel.objects.latest('rating')
return max_rated_entry.details

或者你可以在你的模型元数据中给出字段名:

from django.db import models


class YourModel(models.Model):
#your class definition
class Meta:
get_latest_by = 'rating'

现在可以不使用任何参数调用‘ last ()’:

max_rated_entry = YourModel.objects.latest()
return max_rated_entry.details

如果你想要一个随机的评论,也许可以改进@afahim 关于@Raydel Miranda 评论的回答。如果你想要全部,那么只用过滤器

from django.db.models import Max


# Find the maximum value of the rating and then get the record with that rating.
# Notice the double underscores in rating__max
max_rating = App.objects.aggregate(Max('rating'))['rating__max']
return App.objects.filter(rating=max_rating).first()

如果您还希望在表为空的情况下获得 None以外的值(例如,0) ,那么将 Max联合起来组合起来:

from django.db.models import Max, Value
from django.db.models.functions import Coalesce


max_rating = SomeModel.objects.aggregate(
max_rating=Coalesce(Max('rating'), Value(0))
)['max_rating']

第一个火星日:

from .models import MyMODEL


max_rating = MyMODEL.objects.order_by('-rating').first()

第二个火星日:

from django.db.models import Max
from .models import MyMODEL


max_rating = MyMODEL.objects.aggregate(Max('rating'))

也许能帮到别人的“麻烦”

def get_queryset(self):
sorgu = Sunum.objects.values('id', 'firma', 'projeadi', 'sunumdurum__durum', 'sunumdurum__aciklama'
).annotate(max_rank=Max('sunumdurum__kayittarihi'))
szlk={}
for sor in sorgu :
ana = sor['id'], sor['firma'], sor['projeadi']
dana = sor['sunumdurum__durum'], sor['sunumdurum__aciklama'], sor['max_rank']
szlk.setdefault(ana, dana)
return szlk