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

クエリセットを生成する方法にバグがあるようです。

生成されたステートメントを再編成すると、最も外側に 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 に答える