【问题标题】:Django translating MySQL query to Django QueryDjango 将 MySQL 查询转换为 Django 查询
【发布时间】:2018-05-08 23:12:29
【问题描述】:

如何在 Django 视图中获得与此 MySQL 脚本等效的内容?出发城市、到达城市和旅行日期将由用户输入。

这是我的模型

class Driver(models.Model):
first_name = models.CharField(max_length=30, null=True, blank=False)
last_name = models.CharField(max_length=30, null=True, blank=False)




class Schedule(models.Model):
depart_time = models.TimeField()
arrive_time = models.TimeField()



class TravelDate(models.Model):
start_date = models.DateField(null = True)
interval = models.IntegerField(null = True) 


class Route(models.Model): 
depart_city = models.CharField(max_length=50, null=True, blank=False)
arrive_city = models.CharField(max_length=50, null=True, blank=False)
driver = models.ForeignKey(Driver)
schedule = models.ForeignKey(Schedule)
traveldate = models.ForeignKey(TravelDate)

这是我的 MySQL 脚本。这在我在 MySQL 工作台上运行时有效,但我不确定如何将其转换为 Django Query

    SELECT busapp_route.depart_city, busapp_route.arrive_city, busapp_driver.first_name, busapp_schedule.depart_time 
FROM (((busapp_route INNER JOIN busapp_driver ON busapp_route.driver_id = busapp_driver.id) 
INNER JOIN busapp_schedule ON busapp_route.schedule_id = busapp_schedule.id)
INNER JOIN busapp_traveldate ON busapp_route.traveldate_id = busapp_traveldate.id) 
WHERE busapp_route.depart_city='Tropoje' AND busapp_route.arrive_city='Tirane'
AND (DATEDIFF('2017-11-26', busapp_traveldate.start_date) % busapp_traveldate.interval = 0);

【问题讨论】:

  • 你想达到什么目的?只导入数据?重建应用程序?作为 Django 的强项之一的 Django ORM 将做得更多。
  • 我基本上坚持尝试在 Django 中重复事件。我正在建立一个网站,驾驶员在其中注册并指定路线 A --> B、出发时间、到达时间以及他们执行这条路线的频率(每天、每隔一天、每 3 天......)。当用户在特定日期搜索来自城市 A --> B 的巴士时,我不想显示当天运行的巴士。
  • 只是想如果我猜对了,您正在构建一个应用程序来保持从一个城市到另一个城市的巴士路线?还是您在谈论一些当地的公共交通工具?在后一种情况下,事情可能会变得非常容易,因为您可以简单地定义工作日......

标签: python mysql django django-models django-views


【解决方案1】:

Django 本身不支持 MySQL DATEDIFF。作为一种解决方法,您可以使用以下方法:

from django.db.models.expressions import RawSQL

routes = Route.objects\
    .values('depart_city', 'arrive_city', 'driver__first_name', 'schedule__depart_time', 'traveldate__start_date')\
    .annotate(datediff_mod=RawSQL("DATEDIFF(%s, busapp_traveldate.start_date) MOD busapp_traveldate.interval", ('2017-11-26', )))\
    .filter(depart_city='Tropoje', arrive_city='Tirane', datediff_mod = 0)

我不使用 MySQL,因此无法对此进行测试,但我很确定它应该可以工作,或者至少可以让您了解如何实现它。

【讨论】:

    【解决方案2】:

    我认为这不是一个好主意,尝试从 SQL 端解决这个问题。

    您在那里构建的东西并非微不足道,因为有很多事情要记住。

    您当前的模型设置滞后一些点: 如果用户搜索明年的旅行怎么办?使用您的模型,您必须为未来所有可能的日期创建条目,这几乎无法使用。

    还要考虑将不同模型中的时间和日期分开,因为它们通常应该放在一起,从而导致在日期 x 和时间 y 从 A 到 B 的旅程是一个对象。

    看看django-scheduler 可能会有所帮助,他们解决了使用事件和事件的一些麻烦。看看他们非常好的文档。

    【讨论】:

      猜你喜欢
      • 2016-06-04
      • 1970-01-01
      • 2016-10-23
      • 2016-04-20
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 2018-05-07
      • 2018-06-10
      相关资源
      最近更新 更多