繁体   English   中英

Django Q过滤器未按预期工作

[英]Django Q filter not working as expected

我创建了一个库样式搜索表单(您可以在其中添加新行,并通过链接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)

看起来像是生成查询集的方式中的错误。

重新组织生成的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:这不是一个完整的答案,而是一个方向,因为如果不看代码,可能很难弄清楚错误的确切位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM