2013-07-03 2 views
1

라이브러리 스타일 검색 양식 (AND, OR, AND NOT 또는 OR NOT과 같은 단어를 연결하여 검색을 추가 할 수있는 새 줄을 추가 할 수 있음)을 작성하여 검색 구문을 작성할 수 있도록했습니다 나는 Q 필터로 바뀌려고 노력했다. 어떤 이유로, 생성하는 필터는 OR이 있으면 모든 것을 반환하는 것처럼 보입니다. ('또는 그 안에'은 사용자가 선택했거나 성명서로 사용되었음을 의미합니다.)Django Q 필터가 예상대로 작동하지 않습니다.

예 : 데이터 필드에 NAME, 데이터 필드에 재료, 데이터 필드에 Steel을 값으로 사용하여 개체를 가져 오도록 Q 필터를 만들려고했습니다. 그것은 작동해야처럼 보인다,

(AND: (OR: (AND:), (AND: ('value__icontains', 'Test'), ('represents__exact', <DataField: 3-Name>)), (NOT (AND: ('value__iexact', 'Steel'), ('represents__exact', <DataField: 6-Materials>))))) 

그 문을 읽고,하지만하지 않습니다 그냥 모든 것을 반환하는 것 같다 내가 만든 질문을 인쇄 할 때

, 이것은 내가 무엇을 얻을 수 있습니다.

내가 무엇을 정확히 아니지만, 그것은 형태가 어떻게 생겼는지의 예입니다 enter image description here

UPDATE :

: 결과 Q 문이 대신 수 있도록 내 코드를 변경
(OR: (AND: ('value__icontains', 'er'), ('represents__exact', <DataField: 3-Name>)), (NOT (AND: ('value__iexact', 'er'), ('represents__exact', <DataField: 5-Keywords>)))) 

또는 확장 형태 : 아직도

(OR: 
    (AND: 
     ('value__icontains', 'er'), ('represents__exact', <DataField: 3-Name>) 
    ), 
    (NOT 
     (AND: 
      ('value__iexact', 'er'), ('represents__exact', <DataField: 5-Keywords>) 
     ) 
    ) 
) 

밖으로 다음 코드 인쇄는 모든 데이터베이스에서 :

filtered = objects.filter(q) 
    print("Filtered: ", filtered) 

답변

2

쿼리 세트를 생성하는 방식에 버그가있는 것 같습니다.

생성 된 Q 문을 재구성하면 가장 바깥 쪽 AND에 두 번째 표현식이없는 것처럼 보입니다.

(AND: 
    (OR: 
     (AND:), 
     (AND: 
      ('value__icontains', 'Test'), 
      ('represents__exact', <DataField: 3-Name>) 
     ), 
     (NOT 
      (AND: 
       ('value__iexact', 'Steel'), 
       ('represents__exact', <DataField: 6-Materials>) 
      ) 
     ) 
    ) 
) 

는 또한 빈 (AND:),이 너무 문제를 제기 것, 그래서 빈 Q 객체에게

PS를 제거하는 방법을 알아낼 것이다 :이 때문에 보지 않고, 완전한 대답하지만, 방향 아니다 코드에서 버그가 정확히 어디인지 파악하기 어려울 수 있습니다.

+0

두 번째 표현식없이 AND를 사용하면 문제가 발생합니까? –

+0

AND는 2 진 표현식입니다. 따라서 두 개의 표현식이 필요합니다. 정확히 * 장고가 현재 귀하의 케이스에서 코드를 처리하고 있는지 확실하지 않습니다. – karthikr

+0

제가 설명한 문제를 해결했지만 여전히 작동하지 않습니다. (업데이트를위한 제 질문을 참조하십시오) –