Внутренние объединения с временными метками и без внешнего ключа в Django ORM

Django документация гласит, что нужно проверить ORM перед написанием необработанного SQL, но я не знаю ресурса, который объясняет, как выполнять внутренние соединения между таблицами без внешних ключей, что было бы относительно просто выполнить в нескольких строках SQL.

Многие таблицы в моей базе данных необходимо объединить по связанным со временем свойствам или интервалам. Например, в этом базовом примере мне нужно сначала взять подмножество change_events, а затем объединить другую таблицу ais_data по двум отдельным столбцам:

models.py

class AisData(models.Model):
    navstatus = models.BigIntegerField(blank=True, null=True)
    start_ts = models.DateTimeField()
    end_ts = models.DateTimeField(blank=True, null=True)
    destination = models.TextField(blank=True, null=True)
    draught = models.FloatField(blank=True, null=True)
    geom = models.PointField(srid=4326)
    imo = models.BigIntegerField(primary_key=True)
    
        class Meta:
        managed = False
        db_table = 'ais_data'
        unique_together = (('imo', 'start_ts'),)


class ChangeEvent(models.Model):
    event_id = models.BigIntegerField(primary_key=True)
    imo = models.BigIntegerField(blank=True, null=True)
    timestamp = models.DateTimeField(blank=True, null=True)


    class Meta:
        managed = False
        db_table = 'change_event'

Сначала я беру подмножество change_events, которое возвращает объект QuerySet. Используя результат этого запроса, мне нужно получить все записи в ais_data, которые совпадают по imo и timestamp - таким образом, необработанный SQL будет выглядеть следующим образом:


WITH filtered_change_events AS (

SELECT * FROM change_events WHERE timestamp BETWEEN now() - interval '1' day and now()
)

SELECT fce.*, ad.geom FROM filtered_change_events fce JOIN ais_data ad  ON fce.imo = ad.imo AND fce.timestamp = ad.start_ts

views.py

from .models import ChangeEvent
from .models import AisData
from datetime import datetime, timedelta

start_period = datetime.now() - timedelta(hours=24)
end_period = datetime.now()

subset_change_events = ChangeEvent.filter(timestamp__gte=start_period,
                                          timestamp__lte=end_period)

#inner join 

subset_change_events.filter()?                                          

Как можно написать этот относительно простой запрос, используя язык Django ORM? Мне трудно сделать простое внутреннее соединение двух столбцов без использования внешнего ключа? Любой совет или ссылки на ресурсы были бы полезны.

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