【问题标题】:django query on manytomany fielddjango 查询 manytomany 字段
【发布时间】:2013-03-31 13:10:49
【问题描述】:

我正在使用tastepie 为我的django 应用程序获取REST API。我的模型包括车站(例如火车站)、路线(例如芝加哥到圣路易斯)和 routedetail,它是多对多关系的中间模型,例如RouteDetail(station="Springfield-IL", route="CHI-STL",arrive_time=4.00pm,department_time=4:05pm)

class Station(models.Model):
  name = models.CharField(max_length=10, unique=True)

class Route(models.Model):
  name = models.CharField(max_length=10, unique=True)
  stations = models.ManyToManyField(Station, through='RouteDetail')

class RouteDetail(models.Model):
  station = models.ForeignKey(Station)
  route = models.ForeignKey(Route)
  arrival_time = models.TimeField(blank=True, null=True)
  depart_time = models.TimeField(blank=True, null=True)

我的问题是如何查询从伊利诺伊州林肯市到密苏里州圣路易斯的所有路线? 现在我在 sweetpie 中做了这样的事情,这很有效,但是有没有办法在一个查询中做到这一点?

from_station = request.GET.get('from', None)
to_station = request.GET.get('to', None)
semi_filtered = super(RouteResource, self).apply_filters(request, applicable_filters)
return semi_filtered.filter(stations__name=from_station).filter(stations__name=to_station)

【问题讨论】:

    标签: django django-models tastypie


    【解决方案1】:

    您的模型如何表达从 A 到 B 的路线的存在?在我看来,它似乎包含的信息不够多,无法分辨。

    我能看到如何执行的最接近的查询是询问是否存在路线 R,使得 A 站在 R 路线上,B 站在 R 路线上,并且 A 站的出发时间早于到达站的时间B.

    在 SQL 中:

    SELECT * FROM myapp_route R
     JOIN myapp_routedetail A ON A.station_id = from_station AND A.route_id = R.id
     JOIN myapp_routedetail B ON B.station_id = to_station AND B.route_id = R.id
     WHERE A.depart_time < B.arrival_time;
    

    据我所知,没有办法在 Django 的 ORM 中表达此查询,但您始终可以发出 raw SQL query

    Route.objects.raw('''
        SELECT * FROM myapp_route R
         JOIN myapp_routedetail A ON A.station_id = %s AND A.route_id = R.id
         JOIN myapp_routedetail B ON B.station_id = %s AND B.route_id = R.id
         WHERE A.depart_time < B.arrival_time
         ''', [from_station.id, to_station.id])
    

    但请注意:A.depart_time &lt; B.arrival_time 条件不适用于在午夜之前开始并在午夜之后结束的路线。

    【讨论】:

    • 你说得对,我需要比较到达时间以确定它是否是 A 到 B。我没有包括这个,因为我想专注于减少过滤 from 和 to 两次的查询。无论如何,如果我后来发现这个操作是瓶颈,你对原始 SQL 的建议似乎是合理的选择。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2020-02-01
    • 1970-01-01
    • 2011-09-08
    • 2015-06-23
    • 2013-05-19
    相关资源
    最近更新 更多