У меня есть две модели, Location
и Event
, которые связаны с ForeignKey на модели Event
. Модели разбиваются следующим образом:
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')
В каждой локации есть несколько событий, упорядоченных по убыванию start_date
. Запрос, который я пытаюсь сделать, возвращает следующее предстоящее событие для каждого из местоположений.
В идеале я хотел бы сделать это в одном запросе (я не хочу запускать запрос для каждого местоположения, так как это приведет к большому количеству ненужных обращений к базе данных). Я пытался использовать ORM в Django, и я также пытался использовать сырой SQL, но я столкнулся с некоторым препятствием.
Любая помощь будет принята с благодарностью.
Обновление
Я нашел потенциальное решение, хотя я не уверен, что это лучший метод. Это работает, чего должно быть достаточно, но мне любопытно посмотреть, каким будет лучший способ сделать это.
Во всяком случае, код, который я написал, выглядит так:
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)