【问题标题】:How to "translate" this SQL query to queryset in django如何将此 SQL 查询“翻译”为 django 中的查询集
【发布时间】:2019-09-21 12:58:55
【问题描述】:

所以我得到了这些 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)。在给定起点和终点的情况下,我想获得通过给定起点然后通过给定终点的行程。例如,如果起点和终点是 (B,D),则示例旅行是有效的,因为它在某个时间点经过 B,然后再经过 D,但它对 (D,B) 无效。

我知道在 SQL 中,可以这样完成(假设旅游商店 id 和段有外键限制):

    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

【问题讨论】:

    标签: django django-models orm django-queryset


    【解决方案1】:

    以下查询应该可以让您到达那里,user_originuser_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'))
    )
    

    您获取对Segment 的第一个连接的start_time 的引用,并在第二个filter() 中引用它,从而创建到Segment 的第二个连接。

    【讨论】:

      猜你喜欢
      • 2023-01-31
      • 2021-11-26
      • 1970-01-01
      • 2019-01-26
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      相关资源
      最近更新 更多