Joh*_*hnd 75 django max django-models
我有一个对象列表如何运行查询以给出字段的最大值:
我正在使用此代码:
def get_best_argument(self):
try:
arg = self.argument_set.order_by('-rating')[0].details
except IndexError:
return 'no posts'
return arg
Run Code Online (Sandbox Code Playgroud)
rating是一个整数
Sas*_*gov 140
看到这个.您的代码将类似于以下内容:
from django.db.models import Max
# Generates a "SELECT MAX..." query
Argument.objects.aggregate(Max('rating')) # {'rating__max': 5}
Run Code Online (Sandbox Code Playgroud)
如果您已经从数据库中获取了列表,那么您将执行以下操作:
from django.db.models import Max
args = Argument.objects.filter(name='foo') # or whatever arbitrary queryset
args.aggregate(Max('rating')) # {'rating__max': 5}
Run Code Online (Sandbox Code Playgroud)
这是未经测试的,所以我可能在某个地方犯了一个错误,但你去了.
Lut*_*ann 67
Django还有' latest(field_name = None) '函数,用于查找最新(最大值)条目.它不仅适用于日期字段,还适用于字符串和整数.
您可以在调用该函数时给出字段名称:
max_rated_entry = YourModel.objects.latest('rating')
return max_rated_entry.details
Run Code Online (Sandbox Code Playgroud)
或者您已经可以在模型元数据中提供该字段名称:
from django.db import models
class YourModel(models.Model):
#your class definition
class Meta:
get_latest_by = 'rating'
Run Code Online (Sandbox Code Playgroud)
现在你可以在没有任何参数的情况下调用'latest()':
max_rated_entry = YourModel.objects.latest()
return max_rated_entry.details
Run Code Online (Sandbox Code Playgroud)
afa*_*him 41
我已经为我的项目测试了这个,它在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)
Run Code Online (Sandbox Code Playgroud)
这可以保证有效地为您提供最大元素之一,而不是对整个表进行排序并获得顶部(在O(nlogn)附近).
小智 13
溶胶01:
from .models import MyMODEL
max_rating = MyMODEL.objects.order_by('-rating').first()
Run Code Online (Sandbox Code Playgroud)
溶胶02:
from django.db.models import Max
from .models import MyMODEL
max_rating = MyMODEL.objects.aggregate(Max('rating'))
Run Code Online (Sandbox Code Playgroud)
如果您还想获取None表为空的情况以外的值(例如 0),请Max与Coalesce结合使用:
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']
Run Code Online (Sandbox Code Playgroud)