J'ai deux modèles, Location
et Event
, qui sont liés par ForeignKey sur le modèle Event
. Les modèles se décomposent comme suit:Problème lors de l'écriture d'une requête de base de données
class Location(models.Model):
city = models.CharField('city', max_length=25)
slug = models.SlugField('slug')
class Event(models.Model):
location = models.ForeignKey(Location)
title = models.CharField('title', max_length=75)
start_date = models.DateTimeField('start_date')
end_date = models.DateTimeField('end_date')
Chaque emplacement a plusieurs événements qui sont commandés par start_date
descendant. La requête que j'essaie de faire récupère le prochain événement à venir pour chacun des emplacements.
Idéalement, je voudrais faire cela en une seule requête (je ne veux pas exécuter une requête pour chaque emplacement, car cela causerait beaucoup de hits inutiles à la base de données). J'ai essayé d'utiliser l'ORM de Django, et j'ai aussi essayé d'utiliser du SQL brut, mais j'ai rencontré un peu de blocage.
Toute aide serait grandement appréciée.
Mise à jour
Je suis venu avec une solution potentielle, bien que je ne suis pas convaincu que c'est la meilleure méthode. Cela fonctionne, ce qui devrait suffire, mais je suis curieux de voir quelle serait la meilleure façon de le faire.
Quoi qu'il en soit, le code que j'ai écrit lit ainsi:
l = Location.objects.select_related()
qs = None
# Concatenate the related event querysets into a new queryset
for e in l:
if qs is None:
qs = e.event_set.all()
else:
qs = qs | e.event_set.all()
# Order a slice of the queryset by start_date ascending
qs = sorted(qs[:l.count()], key=lambda s: s.start_date)
Post le code de votre essai et le SQL brut pour comparer – Pentium10
@Gary - Je n'ai pas le temps en ce moment, mais c'est certainement, certainement possible dans l'ORM de Django - ne pas tomber dans le SQL brut pour cela. Je vais essayer de poster une réponse plus tard si personne ne t'a aidé. –