Django Q过滤器无法按预期工作

时间:2013-07-03 16:06:51

标签: python django django-q

我创建了一个库样式搜索表单(您可以在其中添加新行以进一步搜索,使用AND,OR,AND NOT或NOT等链接词)以允许它们在表单中构建搜索语句,然后我试图变成Q过滤器。出于某种原因,我生成的过滤器似乎返回所有内容,如果它中有OR。 (由'或在其中'我的意思是用户选择或作为他们的陈述)。

示例:我想创建一个Q过滤器,以便为其数据字段获取具有NAME的对象,并将Test作为其值,或者使用Material作为其数据字段,将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

更新: 我更改了我的代码,以便生成的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)

1 个答案:

答案 0 :(得分: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对象

P.S:这不是一个完整的答案,而是一个方向,因为如果不查看代码,可能很难弄清楚bug的确切位置。