Как «перевести» этот запрос SQL в набор запросов в Django - PullRequest
1 голос
/ 03 мая 2019

Итак, у меня есть эти модели Django (код, кстати, упрощен):

    class Travel(models.Model):
      #there are many other fields
      origin_city = CharField()
      end_city = CharField()

    class Segment(models.Model):
      start_time = DateTimeField()
      origin = CharField()
      end = CharField()
      travel = ForeignKey(Travel)
      price = IntegerField()

Таким образом, путешествие имеет набор сегментов, например, если путешествие A-> B-> C-> D-> E, то сегментами являются (A, B), (B, C), (C, D) и (D, E).Я хочу получить, учитывая начало и конец, путешествия, которые проходят через данное начало и затем через данный конец.Например, если origin и end равны (B, D), пример перемещения действителен, поскольку он проходит через B в некоторой точке, а затем проходит через D позже, но он не будет действительным для (D, B).

Я знаю, что в SQL это можно сделать следующим образом (при условии, что идентификаторы и сегменты магазинов путешествий имеют ограничения по внешнему ключу):

    SELECT t.*
    FROM travel as t, segment as s1,segment as s2
    WHERE t.id = s1.travel_id AND t.id = s2.travel_id
    AND s1.origin = (user given origin)
    AND s2.end = (user given end)
    AND s1.start_time < s2.start_time

1 Ответ

0 голосов
/ 03 мая 2019

Следующий запрос должен привести вас туда с user_origin и user_end в качестве предоставленных пользователем критериев:

travels = (Travel.objects
    .filter(segment__origin=user_origin)
    .annotate(origin_time=F('segment__start_time'))
    .filter(segment__end=user_end, segment__start_time__gt=F('origin_time'))
)

Вы получаете ссылку на start_time первого соединения на Segment и вернуться к нему во втором filter(), который создает второе соединение с Segment.

...