Como fazer SELECT MAX em Django?

votos
49

Eu tenho uma lista de objetos Como posso executar uma consulta para dar o valor máximo de um campo:

Estou usando este código:

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

avaliação é um número inteiro

Publicado 10/05/2009 em 03:58
fonte usuário
Em outras línguas...                            


3 respostas

votos
100

Veja esta . Seu código seria algo como o seguinte:

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

Se você já tenha obtido a lista do banco de dados, então você faria algo assim:

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

Este não foi testado para que eu possa ter cometido um erro em algum lugar, mas lá vai.

Respondeu 10/05/2009 em 04:14
fonte usuário

votos
51

Django também tem o ' mais recente (field_name = None) função', que encontra a entrada mais recente (máx. Value). Não só funciona com campos de data, mas também com strings e inteiros.

Você pode dar o nome do campo ao chamar essa função:

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

Ou você já pode dar esse nome de campo em seus modelos de dados meta:

from django.db import models

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

Agora você pode chamar de 'mais recente ()' sem quaisquer parâmetros:

max_rated_entry = YourModel.objects.latest()
return max_rated_entry.details
Respondeu 14/06/2013 em 09:07
fonte usuário

votos
37

Eu testei este para o meu projeto, ele encontra o max / min em 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)

Isso é garantido para que você obtenha um dos elementos máximas de forma eficiente, em vez de ordenar a tabela inteira e obter o topo (cerca de O (nlogn)).

Respondeu 21/06/2012 em 11:53
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more