Tengo una lista de objetos, ¿cómo puedo ejecutar una consulta para dar el valor máximo de un campo?
Estoy 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
la calificación es un número entero
django
django-models
max
Johnd
fuente
fuente
Django también tiene la función ' latest (field_name = None) ' que encuentra la última entrada (valor máximo). No solo funciona con campos de fecha, sino también con cadenas y números enteros.
Puede dar el nombre del campo al llamar a esa función:
max_rated_entry = YourModel.objects.latest('rating') return max_rated_entry.details
O ya puede dar ese nombre de campo en los metadatos de sus modelos:
from django.db import models class YourModel(models.Model): #your class definition class Meta: get_latest_by = 'rating'
Ahora puede llamar a 'latest ()' sin ningún parámetro:
max_rated_entry = YourModel.objects.latest() return max_rated_entry.details
fuente
latest()
. Si necesita el registro con el valor mínimo, puede usarearliest()
.latest()
y tambiénearliest()
funciona con campos sin fecha, pero es un efecto secundario de la implementación. Debes usar<your-queryset>.order_by('<interested-field>').first()
o<your-queryset>.order_by('<interested-field>').last()
para asegurarte de que tu código seguirá funcionando incluso si los desarrolladores de Django cambianlatest()
y laearliest()
implementación solo funciona con campos de fecha.He probado esto para mi proyecto, encuentra el máximo / mínimo en el tiempo 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)
Esto está garantizado para obtener uno de los elementos máximos de manera eficiente, en lugar de ordenar toda la tabla y obtener la parte superior (alrededor de O (n * logn)).
fuente