Как моделировать сложные левые соединения в 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 без копирования, так как сейчас их обновление требует много копирования.