如何在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 

评级是一个整数

看到这个 你的代码将如下所示:

 from django.db.models import Max # Generates a "SELECT MAX..." statement Argument.objects.all().aggregate(Max('rating')) 

如果你已经从数据库中获得了列表,那么你可以这样做:

 from django.db.models import Max args = Argument.objects.all() # Calculates the maximum out of the already-retrieved objects args.aggregate(Max('rating')) 

这是未经testing的,所以我可能在某个地方犯了一个错误,但是你去了。

Django也有' latest(field_name = None) '函数来查找最新的(最大值)条目。 它不仅适用于date字段,而且还适用于string和整数。

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

 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' 

现在你可以不带任何参数地调用'latest()':

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

我已经testing了我的项目,它发现O(n)时间的最大/最小值:

 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.all().aggregate(Max('rating'))['rating__max'] return App.objects.get(rating = max_rating) 

这是保证让你有效的最大的元素之一,而不是sorting整个表,并获得顶部(O(nlogn)左右)。