Django将MySQL查询转换为Django查询

2024-03-29 09:28:37 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在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查询

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

Tags: idtruecitymodelmodelsdriverroutenull
2条回答

我不认为从SQL方面解决这个问题是个好主意。你知道吗

你在那里建造的东西,并不是琐碎的,因为有很多事情要记住。你知道吗

您当前的模型设置滞后于以下几点: 如果用户在明年搜索一次旅行怎么办?在你的模型中,你必须为将来所有可能的日期创建条目,这几乎是不可用的。你知道吗

还可以考虑在不同的模型中分离时间和日期,因为它们通常应该放在一起,因为从a到B的行程是在日期x,时间y是一个对象。你知道吗

看看django-scheduler可能会有所帮助,他们解决了一些使用事件和事件的问题。看看他们的好医生。你知道吗

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,所以我无法测试它,但我非常确定它应该可以工作,或者至少可以给你一个如何实现它的想法。你知道吗

相关问题 更多 >