Django - Получение последнего связанного объекта для каждого объекта в наборе запросов с помощью одного запроса к базе данных

У меня есть приложение Django, где я собираю данные с датчиков, которые разделены на области.

class Area(models.Model):
  name = models.CharField(max_length=50)
  code = models.IntegerField(unique=True, primary_key=True)

class Sensor(models.Model):
  name = models.CharField(max_length=30)
  area = models.ForeignKey(Area, on_delete=models.CASCADE)

class Observation(models.Model):
  date_time = models.DateTimeField()
  sensor = models.ForeignKey(Sensor, on_delete=models.CASCADE)
  value = models.DecimalField(max_digits=4, decimal_places=1)

Для каждой области мне нужен список последних наблюдений в этой области, то есть по одному на каждый датчик.

Пока что я решил эту проблему следующим образом:

class Sensor(models.Model)
  ...
  def latest_observation(self):
    return self.observation_set.latest('date_time')

Теперь я могу пройтись по датчикам, чтобы получить последние наблюдения для каждого датчика.

class Area(models.Model):
  ...

  def latest_observations_per_sensor(self):
    return [s.latest_observation() for s in self.sensor_set.all()]

Это возвращает список того, что я хочу, но это не очень эффективно, так как делает запрос к базе данных для каждого отдельного датчика. В идеале, я бы сделал это одним запросом к базе данных для всех областей, но я не знаю, возможно ли это в Django.

Вернуться на верх