queryset objects __gte django django-models max

objects - ¿Cómo hacer SELECCIONAR MAX en Django?



objects.filter django (3)

Tengo una lista de objetos. ¿Cómo puedo ejecutar una consulta para obtener 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 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.

Puedes dar el nombre del campo cuando llames 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 su modelo:

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


He probado esto para mi proyecto, encuentra el máximo / mínimo en O (n) tiempo:

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)

Esto garantiza que obtendrá uno de los elementos máximos de manera eficiente, en lugar de clasificar toda la tabla y obtener la parte superior (alrededor de O (nlogn)).


Mira this Su código sería algo como lo siguiente:

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

Si ya has sacado la lista de la base de datos, harías algo como esto:

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

Esto no se ha probado, así que puede haber cometido un error en alguna parte, pero ahí lo tienes.