2014-01-09 3 views
0

날짜 범위 내에서 발생하는 모든 이벤트를 선택하려면 장고에 쿼리 문을 작성하는 방법을 알아 내려고합니다. 이벤트에는 하나 이상의 Schedule 개체를 가리키는 ManyToMany 필드 schedules이 있습니다. 기본적으로는 다음과 같습니다Django에서 날짜 범위 내의 이벤트 선택

class Event(models.Model): 
    name = models.CharField(max_length=255) 
    schedules = models.ManyToManyField(Schedule) 

class Schedule(models.Model): 
    from_date = models.DateTimeField(default="1970-01-01", blank=True) 
    to_date = models.DateTimeField(default="1970-01-01", blank=True) 

    class Meta: 
     ordering = ('from_date', 'to_date',) 

그래서 이벤트는 다음과 같이 많은 예약 된 경우를 가질 수있다 : 나는 schedule (3) 같은 일정 event1 같은 이벤트가있는 경우

Event | from_date | to_date 
---------------------------------- 
event1 | 2013-01-01 | 2013-01-02 (1) 
     | 2013-01-04 | 2013-01-07 (2) 
     | 2013-01-01 | 2013-04-30 (3) 

event2 | 2013-01-01 | 2013-01-03 (4) 
     | 2013-01-02 | 2013-01-10 (5) 
     | 2013-02-10 | 2013-04-15 (6) 
... 

, 나는 해당 이벤트를 싶습니다 2 월 필터를 사용하여 반환 할 수 있습니다. 이 경우 schedule (6)이 있으므로 event2도 반환해야합니다.

이 내가 이러한 이벤트를 선택하려고하는 방법입니다 : (2013-02-01,2013-02-28)을 :이 같은 날짜 범위 2 월에 발생하는 모든 이벤트를 필터링 할 때

events = Event.objects.filter(
      Q(schedules__from_date__gte=from_date) & 
      Q(schedules__to_date__lte=to_date)) 
events = events.distinct() 

이 나에게 정확한 결과를 제공하지 않습니다.

어떤 도움이 크게 감사합니다, 감사합니다.

답변

1

은 다음과 같이 그것을 시도 :

events = Event.objects.filter(
     Q(schedules__from_date__gte=from_date) | Q(schedules__to_date__gte=from_date), 
     Q(schedules__to_date__lte=to_date) | Q(schedules__from_date__lte=to_date)) 
events = events.distinct() 

는 희망이 도움이! Q 클래스에 대한 전체 설명을 보려면 docs here

로직에 관해서는 "시작일"다음에 일정이 시작 또는 종료되는 이벤트를 얻는 것입니다. 이후 시작된 경우 START 또는 FINISH 날짜가 "~ 날짜"보다 낮아야합니다. 이전에 시작된 경우 간격으로 완료해야하므로 조건도 충족합니다.

설명하기 다소 복잡합니다. 나중에 더 자세히 설명합니다!

+0

아, awesomeness. 왜/어떻게 작동하는지에 대한 설명을 해주실 시간이 있으시면 그 부분을 듣고 싶습니다. :) – span

+0

설명을 주셔서 감사합니다. 더 자세히 설명 할 필요가 없습니다. 그것은 지금 명백하다! – span

관련 문제