Djangoで自己結合(self join)したい2024-01-25

🐈 やりたいこと

このようにゃSQLが組みたかった

select departure.time
from 発着時刻テーブル as departure
inner join 発着時刻テーブル as arrival
    on departure.列車番号 = arrival.列車番号
where departure.station = '青梅駅'
and arrival.station = '奥多摩駅'
and departure.index < arrival.index
  • 発着時刻テーブルには各駅の発着時刻が保存されている
  • これを自己結合して、青梅発、奥多摩行列車の発車時刻を得る


Modelはこんにゃ感じ

class 列車番号テーブル(models.Model):
    code = models.CharField()    # 列車番号

class 発着時刻テーブル(models.Model):
    number = models.ForeignKey(列車番号テーブル)    # 列車番号
    index = models.IntegerField()    # 停車順
    station = models.ForeignKey(駅テーブル)    # 駅
    time = models.DateTimeField()    # 発着時刻



・・・🐈‍⬛・・・🐈‍⬛・・・🐈‍⬛・・・


列車番号テーブル(親)を介して発着時刻(子)を自己結合する

class 時刻表View(ObjectMultipleModelAPIView):
    def get_querylist(self, *args, **kwargs):
        発車時刻 = 発着時刻テーブル.objects.filter(
            station='青梅駅',
            列車番号テーブル__発着時刻テーブル__station='奥多摩駅',
            index__lt=F('列車番号テーブル__発着時刻テーブル__index')
        )

列車番号テーブル__発着時刻テーブル__とすることで親経由で子を自己結合する