Pour autant que je sache, il n'y a pas de moyen unique de le faire dans l'ORM de Django, mais vous pouvez le diviser en deux requêtes :
from django.db.models import Max
bakeries = Bakery.objects.annotate(
hottest_cake_baked_at=Max('cake__baked_at')
)
hottest_cakes = Cake.objects.filter(
baked_at__in=[b.hottest_cake_baked_at for b in bakeries]
)
Si les identifiants des gâteaux progressent avec les horodatages bake_at, vous pouvez simplifier et désambiguïser le code ci-dessus (dans le cas où deux gâteaux arrivent en même temps, vous pouvez obtenir les deux) :
from django.db.models import Max
hottest_cake_ids = Bakery.objects.annotate(
hottest_cake_id=Max('cake__id')
).values_list('hottest_cake_id', flat=True)
hottest_cakes = Cake.objects.filter(id__in=hottest_cake_ids)
Le mérite en revient à Daniel Roseman, qui a déjà répondu à une question similaire de ma part :
http://groups.google.pl/group/django-users/browse_thread/thread/3b3cd4cbad478d34/3e4c87f336696054?hl=pl&q=
Si la méthode ci-dessus est trop lente, alors je connais aussi une deuxième méthode - vous pouvez écrire un SQL personnalisé produisant uniquement les gâteaux les plus chauds dans les boulangeries concernées, le définir en tant que VIEW de base de données, et ensuite écrire un modèle Django non géré pour cela. C'est également mentionné dans le fil de discussion django-users ci-dessus. Le lien direct vers le concept original est ici :
http://web.archive.org/web/20130203180037/http://wolfram.kriesing.de/blog/index.php/2007/django-nice-and-critical-article#comment-48425
J'espère que cela vous aidera.
7 votes
J'aimerais bien voir ça aussi :-)