如何在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)左右)。