にゃーん☆ฅ^•ω•^ฅ
ハマったこと、つまづいたことにゃどの記録
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')
)
列車番号テーブル__発着時刻テーブル
__
とすることで親経由で子を自己結合する