J'ai une liste d'objets comment puis-je exécuter une requête pour donner la valeur maximale d'un champ:
J'utilise ce code:
def get_best_argument(self):
try:
arg = self.argument_set.order_by('-rating')[0].details
except IndexError:
return 'no posts'
return arg
la note est un entier
django
django-models
max
Johnd
la source
la source
Django a également la fonction ' latest (field_name = None) ' qui trouve la dernière entrée (valeur max.). Cela fonctionne non seulement avec les champs de date, mais également avec des chaînes et des entiers.
Vous pouvez donner le nom du champ lors de l'appel de cette fonction:
max_rated_entry = YourModel.objects.latest('rating') return max_rated_entry.details
Ou vous pouvez déjà donner ce nom de champ dans les métadonnées de vos modèles:
from django.db import models class YourModel(models.Model): #your class definition class Meta: get_latest_by = 'rating'
Vous pouvez maintenant appeler 'latest ()' sans aucun paramètre:
max_rated_entry = YourModel.objects.latest() return max_rated_entry.details
la source
latest()
. Si vous avez besoin de l'enregistrement avec la valeur minimale, vous pouvez utiliserearliest()
.latest()
etearliest()
fonctionne également avec un champ non-date, mais c'est un effet secondaire de l'implémentation. Vous devez utiliser<your-queryset>.order_by('<interested-field>').first()
ou<your-queryset>.order_by('<interested-field>').last()
pour vous assurer que votre code fonctionnera toujours même si les développeurs Django vont changerlatest()
etearliest()
implémenter pour travailler avec les champs de date uniquement.J'ai testé cela pour mon projet, il trouve le max / min en temps 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)
Ceci est garanti pour vous obtenir l'un des éléments maximum efficacement, plutôt que de trier toute la table et d'obtenir le haut (autour de O (n * logn)).
la source