2017-11-25 6 views
0

어떻게하면 장고 뷰에서이 MySQL 스크립트와 동등한 결과를 얻을 수 있습니까? depart_city, arrive_city 및 travel_date는 사용자가 입력합니다.Django MySQL 쿼리를 Django로 변환하기 쿼리

은 여기 내 모델

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의 워크 벤치에서 실행할 때 작동하지만 나는 기본적으로 MySQL의 DATEDIFF를 지원하지 않습니다 장고 쿼리

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

달성하려는 목표는 무엇입니까? 데이터 가져 오기만 하시겠습니까? 앱을 다시 빌드 하시겠습니까? Django의 강점 중 하나 인 Django ORM은 훨씬 더 많은 작업을 수행합니다. – normic

+0

기본적으로 장고에서 이벤트를 반복하기 위해 노력하고 있습니다. 저는 운전자가 스스로 등록하고 A -> B, 출발 시간, 도착 시간, 그리고 그들이 얼마나 자주이 경로를하는지 (매일, 매일, 매 3 일마다 ...) 웹 사이트를 구축하고 있습니다. 사용자가 특정 날짜에 A -> B 도시에서 버스를 검색하면 해당 날짜에 실행되는 버스를 표시하지 않습니다. – Florian

+0

당신이 맞다면, 한 도시에서 다른 도시로가는 버스 경로를 유지하는 앱을 만들고있는 것일까 요? 아니면 지역 대중 교통에 대해 이야기하고 있습니까? 후자의 경우에는 평일을 정의 할 수 있기 때문에 상황이 매우 쉬울 수도 있습니다. – normic

답변

0

장고이 번역하는 방법을 모르겠어요. 해결 방법으로는 다음과 같이 사용할 수 있습니다

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을 사용하지 않는,하지만 나는 그것이 작동합니다 확신 아니면 적어도 당신에게 어떻게 아이디어를 줄 그것을 구현합니다.

+0

완벽하게 정상적으로 작동합니다. 고마워. – Florian

0

나는 SQL 측에서 이것을 풀려고하는 것이 좋다고 생각하지 않는다.

당신이 거기에서 만들고있는 것은, 명심해야 할 것이 많기 때문에 사소하지 않습니다.

현재 모델 설정에 몇 가지 차이가 ​​있습니다. 사용자가 내년에 여행을 검색하면 어떻게됩니까? 모델을 사용하면 앞으로 모든 가능한 날짜에 대한 항목을 만들어야하는데, 거의 사용할 수 없습니다.

다른 모델에서 시간과 날짜를 분리하는 것도 생각해보십시오. 일반적으로 함께 보관해야하며 날짜 x와 시간 y에서 A에서 B까지 타고 야합니다. 하나의 개체입니다.

django-scheduler을 살펴 보는 것이 도움이 될 수 있습니다. 이벤트 및 Occurences 사용시 문제가 해결되었습니다. 그들의 좋은 문서들을 한번보세요.