Eu tenho uma lista de objetos, como posso executar uma consulta para fornecer 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
a classificação é um número inteiro
django
django-models
max
Johnd
fonte
fonte
Django também tem a função ' latest (field_name = None) ' que encontra a entrada mais recente (valor máximo). Não funciona apenas com campos de data, mas também com strings e inteiros.
Você pode fornecer 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 nos metadados de seus modelos:
from django.db import models class YourModel(models.Model): #your class definition class Meta: get_latest_by = 'rating'
Agora você pode chamar 'mais recente ()' sem nenhum parâmetro:
max_rated_entry = YourModel.objects.latest() return max_rated_entry.details
fonte
latest()
. Se precisar do registro com o valor mínimo, você pode usarearliest()
.latest()
eearliest()
funciona com o campo sem data também, mas é um efeito colateral da implementação. Você deve usar<your-queryset>.order_by('<interested-field>').first()
ou<your-queryset>.order_by('<interested-field>').last()
para garantir que seu código ainda funcione, mesmo que os desenvolvedores Django mudemlatest()
eearliest()
implementem para trabalhar apenas com campos de data.Eu testei isso para o meu projeto, ele encontra o máximo / mínimo no tempo 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)
Isso é garantido para obter um dos elementos máximos de forma eficiente, em vez de classificar a tabela inteira e obter o topo (em torno de O (n * logn)).
fonte