【问题标题】:Django Q filter not working as expectedDjango Q 过滤器没有按预期工作
【发布时间】:2013-07-01 10:22:22
【问题描述】:

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

【问题讨论】:

    标签: python django django-q


    【解决方案1】:

    看起来您生成查询集的方式存在错误。

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

    【讨论】:

    • 没有第二个表达式的 AND 会导致问题吗?
    • AND 是一个二进制表达式。所以它需要2个表达式。不确定在您的情况下 究竟 django 如何处理代码
    • 我想我解决了您描述的问题,但仍然无法正常工作(请参阅我的问题进行更新)
    • represents datetime 吗?如果是这样,__exact 可能不起作用。只需使用=
    • 一种调试方式——查询生成的子Q参数,看看它们是否单独工作
    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2013-09-02
    • 1970-01-01
    相关资源
    最近更新 更多