Mam listę obiektów, w jaki sposób mogę uruchomić zapytanie, aby podać maksymalną wartość pola:
Używam tego kodu:
def get_best_argument(self):
try:
arg = self.argument_set.order_by('-rating')[0].details
except IndexError:
return 'no posts'
return arg
ocena jest liczbą całkowitą
django
django-models
max
Johnd
źródło
źródło
Django ma również funkcję „ latest (field_name = None) ”, która wyszukuje najnowszy (maks. Wartość) wpis. Działa nie tylko z polami daty, ale także z łańcuchami i liczbami całkowitymi.
Podczas wywoływania tej funkcji możesz podać nazwę pola:
max_rated_entry = YourModel.objects.latest('rating') return max_rated_entry.details
Lub możesz już podać nazwę tego pola w metadanych swoich modeli:
from django.db import models class YourModel(models.Model): #your class definition class Meta: get_latest_by = 'rating'
Teraz możesz wywołać „najnowsze ()” bez żadnych parametrów:
max_rated_entry = YourModel.objects.latest() return max_rated_entry.details
źródło
latest()
. Jeśli potrzebujesz rekordu z minimalną wartością, możesz użyćearliest()
.latest()
iearliest()
działa również z polem innym niż data, ale jest to efekt uboczny implementacji. Powinieneś użyć<your-queryset>.order_by('<interested-field>').first()
lub,<your-queryset>.order_by('<interested-field>').last()
aby upewnić się, że twój kod będzie nadal działał, nawet jeśli programiści Django zmienią sięlatest()
iearliest()
zaimplementują, aby działały tylko z polami daty.Przetestowałem to dla mojego projektu, znajduje maksymalny / min w czasie 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)
Gwarantuje to wydajne uzyskanie jednego z maksymalnych elementów, zamiast sortowania całej tabeli i uzyskiwania szczytu (wokół O (n * logn)).
źródło