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.