ライブラリ スタイルの検索フォーム (新しい行を追加して検索をさらに進めることができ、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)