Django将MySQL查询转换为Django Query

时间:2017-11-25 00:58:58

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

如何在Django视图中获得相应的MySQL脚本? depart_city,arrival_city和travel_date将由用户输入。

这是我的模特

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);

2 个答案:

答案 0 :(得分:0)

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,所以我无法测试这个,但我很确定它应该可以工作,或者至少可以让你知道如何实现它。

答案 1 :(得分:0)

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

你在那里建造的东西并不是微不足道的,因为要记住很多事情。

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

还要考虑在不同模型中分隔时间和日期,因为它们通常应该保持在一起,导致在日期x从A到B的乘坐,时间y是一个对象。

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