1

我创建了一个库风格的搜索表单(您可以在其中添加新行以进一步搜索,并使用 AND、OR、AND NOT、OR 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>)))))

阅读该声明,它似乎应该工作,但它没有而且似乎只是返回所有内容。

这不完全是我所拥有的,但它是表单外观的一个示例: 在此处输入图像描述

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

1 回答 1

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:这不是一个完整的答案,而是一个方向,因为不看代码可能很难找出错误的确切位置。

于 2013-07-03T16:15:09.173 回答