如何在Django中选择MAX?

csbfibhn  于 2023-03-04  发布在  Go
关注(0)|答案(7)|浏览(187)

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

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

等级为整数

jc3wubiy

jc3wubiy1#

请参见this。您的代码将类似于以下内容:

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
4c8rllxm

4c8rllxm2#

Django还有一个函数“latest(field_name = None)”,可以找到最新的(max. value)条目,它不仅可以处理日期字段,还可以处理字符串和整数。
您可以在调用该函数时给予字段名称:

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

或者你可以在你的模型 meta数据中给予这个字段命名:

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
nfs0ujit

nfs0ujit3#

我已经在我的项目中测试过了,它可以在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.aggregate(Max('rating'))['rating__max']
return App.objects.get(rating=max_rating)

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

vpfxa7rd

vpfxa7rd4#

焊料01:

from .models import MyMODEL

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

焊料02:

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

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

fdx2calv5#

如果您还想在表为空的情况下获得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']
xvw2m8pv

xvw2m8pv6#

如果你想要一个随机的评论,也许可以改进@afahim关于@Raydel米兰达评论的回答。如果你想要所有评论,那么只使用过滤器

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()
gg0vcinb

gg0vcinb7#

也许这能帮到CBV的人

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

相关问题