2013-07-03 19 views
1

我创建了一个图书馆风格的搜索形式(您可以在其中添加新信息,进一步搜索,用连接词如AND,OR,AND NOT,OR NOT),允许他们建立的搜索语句在形式上,然后我试图变成一个Q过滤器。出于某种原因,我生成的过滤器似乎会返回一切,如果有OR的话。 (按'或其中'我的意思是用户选择或作为他们的声明)。Django的Q过滤器工作不正常

例子:我想创造问答过滤器,这样我会得到对象与NAME其数据域和测试作为其值或与材料作为其数据域和钢作为其值。

当我打印出来创建了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

更新: 我改变了我的代码,这样所得到的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

的和没有第二个表达出现问题了? –

+0

AND是一个二进制表达式。所以它需要2个表达式。不知道如何准确* * Django是处理代码,现在你的情况 – karthikr

+0

我想我定你所描述的问题,但它仍然无法正常工作(见我的问题的更新) –