2016-06-08 2 views
0

관련 모델의 데이터에 의해 Q 오브젝트 검색은 다음과 같이 작동합니다 내 데이터베이스 쿼리가 : 그것은 잘 작동장고 내가 Q 개체가

class EventSearchManager(models.Manager): 

     q_objects = [] 

     terms = [term.strip() for term in search_terms.split()] 

     today = date.today() 

     if timeselect == "Today": 
      first_day = today 
      last_day = None 

     for term in terms: 
      search = (
       Q(name__icontains=term) | 
       Q(tags__label__icontains=term), 
      ) 

      if first_day is not None: 
       operators.update({'start_date__gte': first_day}) 
      if last_day is not None: 
       operators.update({'start_date__lte': last_day}) 

      q_objects.append(Q(*search, **operators)) 

     qs = self.get_queryset() 

     return qs.filter(reduce(operator.or_, q_objects)) 

을,하지만 난 그냥 그렇게 이벤트를 리팩토링했습니다 start_date은 별도의 EventInstance 모델에 존재합니다 (이 경우 이벤트는 시작일이 불명확 할 수 있음).

이제이 검색을 적용하여 operators.update({'start_date__gte': first_day})이 모든 연결된 EventInstance 개체의 start_date을 참조하도록 이벤트 개체를 반환하고 싶습니다. 내가 할 수있는 간단한 구문 조정이 있습니까, 아니면이 프로세스를 완전히 재구성해야합니까? 아니면 Q 객체를 너무 많이 묻는 것입니까?

이는 관계를 설정 EventInstance 내 모델이다

class EventInstance(models.Model): 
    event = models.ForeignKey(Event) 
    start = models.DateTimeField() 
    duration = models.TimeField() 
    recurring = models.CharField(max_length=2) 

답변

3

Q 객체 정확하게 통상 필터 조건과 동일하다. 필터 조건에서 관계를 추적 할 수 있기 때문에 Q에서도이를 수행 할 수 있습니다.

당신은 당신의 모델을 보여주지 않지만, 관계를 가정하는 것은 단지 eventinstance이라고 할 수있다 :

operators.update({'eventinstance__start_date__gte': first_day})