web-dev-qa-db-fra.com

Django orm obtenir la dernière version pour chaque groupe

J'utilise Django 1.6 avec Mysql

J'ai ces modèles

class Student(models.Model):
     username = models.CharField(max_length=200,unique = True)

class Score(models.Model)
     student = models.ForeignKey(Student)
     date = models.DateTimeField()
     score = models.IntegerField()

Maintenant, je veux obtenir le dernier record de score pour chaque élève.
j'ai essayé

Score.objects.values('student').annotate(latest_date=Max('date'))

j'ai aussi essayé

Score.objects.values('student__username').annotate(latest_date=Max('date'))

comme décrit Django ORM - Obtenir le dernier enregistrement pour le groupe mais cela n'a pas aidé.

41
yossi

Cela devrait fonctionner sur Django 1.2+ et MySQL:

Score.objects.annotate(
  max_date=Max('student__score__date')
).filter(
  date=F('max_date')
)
33
nitwit

Si votre base de données est postgres qui prend en charge distinct() sur le champ, vous pouvez essayer

Score.objects.order_by('student__username', '-date').distinct('student__username')
41
Rohan

Je crois que cela vous donnerait l'étudiant et les données

Score.objects.values('student').annotate(latest_date=Max('date'))

Si vous voulez les enregistrements Score complets, il semble que vous devrez utiliser une requête SQL brute: Filtrage Django Requête par enregistrement avec la valeur de colonne maximale

4
Paul Draper