Как моделировать сложные левые соединения в Django

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

class PositionUnadjusted(models.Model):
    identifier = models.CharField(max_length=256)
    timestamp = models.DateTimeField()
    quantity = models.IntegerField()

class Adjustment(models.Model):
    identifier = models.CharField(max_length=256)
    start = models.DateTimeField()
    end = models.DateTimeField()
    quantity_delta = models.IntegerField()

Я хочу создать понятие скорректированной позиции, где количество изменяется на сумму qty_deltas всех корректировок, где adj.start <= pos.date < adj.end. В SQL это будет

  SELECT pos_unadjusted.id, 
         pos_unadjusted.timestamp,
         pos_unadjusted.identifier,
         CASE
           WHEN Sum(qty_delta) IS NOT NULL THEN pos_unadjusted.qty + Sum(qty_delta)
           ELSE qty
         END AS qty,
  FROM   myapp_positionunadjusted AS pos_unadjusted
         LEFT JOIN myapp_adjustment AS adjustments
                ON pos_unadjusted.identifier = adjustments.identifier
                   AND pos_unadjusted.timestamp >= date_start
                   AND pos_unadjusted.timestamp < date_end
  GROUP  BY pos_unadjusted.id, 
            pos_unadjusted.timestamp,
            pos_unadjusted.identifier,

Есть ли способ получить этот результат без использования raw sql? Я использую этот запрос как основу для многих других запросов, поэтому я не хочу использовать сырой sql.

Я изучил QuerySet и extra(), но не могу заставить их иметь такую точную связь. Я бы хотел, чтобы position и PositionUnadjusted имели одну и ту же модель и один и тот же API без копирования, так как сейчас их обновление требует много копирования.

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